- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 JAXB 根据定义的模式编码/解码 xml 文档。我注意到 JAXB 在编码的 xml 中生成不正确的 namespace 。
这里是详细信息-
soap.xsd -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope"
xmlns:svc="http://abc.com/ServiceSetupV001"
targetNamespace="http://schemas.xmlsoap.org/soap/envelope"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:import namespace="http://abc.com/ServiceSetupV001" schemaLocation="schema1.xsd" />
<xsd:complexType name="Envelope">
<xsd:sequence minOccurs="0" maxOccurs="1">
<xsd:element name="Body" type="soapenv:Body" minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Body">
<xsd:sequence minOccurs="0" maxOccurs="1">
<xsd:element name="detailsRequest" type="svc:DetailsRequest" minOccurs="0" maxOccurs="1"/>
<xsd:element name="detailsResponse" type="svc:DetailsResponse" minOccurs="0" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
schema1.xsd -->
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://abc.com/ServiceSetupV001"
xmlns:svc="http://abc.com/ServiceSetupV001"
xmlns:osa="http://abc.com/xmlschema/osa"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:import namespace="http://abc.com/xmlschema/osa" schemaLocation="schema2.xsd"/>
<xsd:complexType name="DetailsRequest">
<xsd:sequence minOccurs="0" maxOccurs="1">
<xsd:element name="requestHeader" type="osa:RequestHeader" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="detailsRequest" type="svc:DetailsRequest" />
<xsd:complexType name="DetailsResponse">
<xsd:sequence minOccurs="0" maxOccurs="1">
<xsd:element name="responseHeader" type="osa:ResponseHeader" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="detailsResponse" type="svc:DetailsResponse" />
</xsd:schema>
schema2.xsd -->
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:osa="http://abc.com/xmlschema/osa"
targetNamespace="http://abc.com/xmlschema/osa"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:complexType name="RequestHeader">
<xsd:sequence>
<xsd:element name="component" type="string" />
<xsd:element name="channel" type="string" />
<xsd:element name="serverInstance" type="string" minOccurs="0" />
<xsd:element name="traceId" type="string" />
<xsd:element name="applicationId" type="string" />
<xsd:element name="userId" type="string" minOccurs="0" />
<xsd:element name="userIdType" type="string" minOccurs="0" />
<xsd:element name="role" type="string" minOccurs="0" />
<xsd:element name="timestamp" type="dateTime" minOccurs="0" />
<xsd:element name="isReplyExpected" type="boolean" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ResponseHeader">
<xsd:sequence>
<xsd:element name="component" type="string" />
<xsd:element ref="osa:service" />
<xsd:element name="traceId" type="string" />
<xsd:element name="serverInstance" type="string" />
<xsd:element name="timestamp" type="dateTime" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="service" type="osa:Service" />
<xsd:complexType name="Service">
<xsd:sequence>
<xsd:element name="name" type="string" />
<xsd:element name="operation" type="string" />
<xsd:element name="version" type="string" />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
我已经为 jaxbMarshaller 定义了一个 namespacePrefixMapperImpl(在我的 spring 配置中),它将 URI 映射到我定义的前缀名称。
编码的响应 xml 如下所示。请注意,JAXB 在 namespace 前缀上搞砸了。 JAXB 正在使用 soapenv 命名空间对于 detailsResponse 复杂类型,而不是 svc 前缀。然后它使用 svc 前缀作为 responseHeader 复杂类型而不是 osa 前缀。一些元素是字符串类型,因此不应该有前缀(即默认命名空间)。等等……
我哪里错了?或者这是 jaxb-impl 的问题。
生成的 XML -->
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope"
xmlns:osa="http://abc.com/xmlschema/osa"
xmlns:svc="http://abc.com/ServiceSetupV001">
<soapenv:Body>
<soapenv:detailsResponse>
<svc:responseHeader>
<osa:component/>
<osa:service/>
<osa:traceId>sadasdas</osa:traceId>
<osa:serverInstance>40d501</osa:serverInstance>
<osa:timestamp>2012-07-01T02:18:00.693Z</osa:timestamp>
</svc:responseHeader>
</soapenv:detailsResponse>
</soapenv:Body>
</soapenv:Envelope>
我用来从模式生成 JAXB 类的插件在我的 pom.xml 中定义如下:
<!-- Plugin to generate jaxb classes from xsd -->
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.2</version>
<executions>
<execution>
<id>process-xsd</id>
<goals>
<goal>generate</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<schemaIncludes>
<include>**/*.xsd</include>
</schemaIncludes>
<bindingIncludes>
<include>**/*.xjb</include>
</bindingIncludes>
<generateDirectory>${src.dir}</generateDirectory>
<verbose>true</verbose>
<extension>true</extension>
<args>
<arg>-Xannotate</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics-annotate</artifactId>
<version>0.6.4</version>
</plugin>
</plugins>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.6</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>stax</groupId>
<artifactId>stax-api</artifactId>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>activesoap</groupId>
<artifactId>jaxb-xercesImpl</artifactId>
<version>1.5</version>
</dependency>
</dependencies>
</plugin>
最佳答案
好吧,看起来 Jaxb 正在为导入的子元素保留包含 xsd 的目标 namespace ,即使那些导入的子元素有自己的 namespace 。解决此问题的一种方法是将架构中导入元素的定义从“type”更改为“ref”。
但是,在这种情况下,我不想修改模式,因为它们来自客户端,因此我们不想修改它们以使其工作。
因此,我在 bindings.xjb 文件中添加了以下注释。我现在可以看到生成的模式类中的元素具有正确的命名空间声明。但是,现在的问题是生成的 xml 不会生成子元素,即使命名空间现在是正确的。
所以,我又有点卡住了。没想到这么难。
对我的 bindings.xjb 的更改:
<jaxb:bindings node="//xsd:complexType[@name='Body']//xsd:element[@name='detailsRequest']">
<annox:annotate target="field">
<annox:annotate annox:class="javax.xml.bind.annotation.XmlElement"
name="detailsRequest"
namespace="http://abc.com/ServiceSetupV001"/>
</annox:annotate>
<jaxb:bindings node="//xsd:complexType[@name='Body']//xsd:element[@name='detailsResponse']">
<annox:annotate target="field">
<annox:annotate annox:class="javax.xml.bind.annotation.XmlElement"
name="detailsResponse"
namespace="http://abc.com/ServiceSetupV001"/>
</annox:annotate>
</jaxb:bindings>
<jaxb:bindings node="//xsd:complexType[@name='DetailsRequest']//xsd:element[@name='requestHeader']">
<annox:annotate target="field">
<annox:annotate annox:class="javax.xml.bind.annotation.XmlElement"
name="requestHeader"
namespace="http://abc.com/xmlschema/osa"/>
</annox:annotate>
<jaxb:bindings node="//xsd:complexType[@name='DetailsResponse']//xsd:element[@name='responseHeader']">
<annox:annotate target="field">
<annox:annotate annox:class="javax.xml.bind.annotation.XmlElement"
name="responseHeader"
namespace="http://abc.com/xmlschema/osa"/>
</annox:annotate>
</jaxb:bindings>
生成的类有适当的命名空间注释
@XmlElement(name = "detailsRequest", namespace = "http://abc.com/ServiceSetupV001")
protected DetailsRequest detailsRequest;
@XmlElement(name = "detailsResponse", namespace = "http://abc.com/ServiceSetupV001")
protected DetailsResponse detailsResponse;
但是现在,编码的 XML 没有值
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope"
xmlns:osa="http://abc.com/xmlschema/osa"
xmlns:svc="http://abc.com/ServiceSetupV001">
<soapenv:Body>
<svc:detailsResponse/>
</soapenv:Body>
</soapenv:Envelope>
关于namespaces - JAXB Impl 在编码的 xml 中生成不正确的命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11962835/
我想实现一个转换特性,涵盖支持现有转换的所有类型。我认为这可以通过以下方式完成: impl Into for T where T: Into, { fn into(self) -> B {
看来我不能在 Rust 中调用相同结构的方法,或者我不明白: struct St1 { aa: String } impl St1 { pub fn method1() -> String {
我正在使用 pimpl idiom在我的代码中有很多,主要是为了减少编译时间。 我遇到了调用 C 库的情况。我有一个 C++ 包装器类,它有它的接口(interface),血淋淋的细节都在 impl
我有以下代码: use std::ops::Div; use std::ops::Mul; #[derive(Debug)] struct Foo { bar: T, } impl Foo w
从 Rust 1.34 开始,我们可以通过实现 TryFrom 来编写类型之间的易错转换。特征: struct Foo(i32); struct Bar; impl TryFrom for Foo {
我开始了一个非常小的程序来玩 Rust 中的解析器组合器,很快就遇到了一个我觉得很奇怪的错误: trait Parser { fn parse(&self, input: &'a [u8])
这个问题在这里已经有了答案: NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton() (4 个答案) 关闭 5 年前。
在扩展其他 crate 中定义的 trait 时,似乎有两种方法可以默认实现新的 trait。 特征的原始定义是 pub trait Trait1 { fn f1(&self); } 为了扩展
我通过扩展 AbstractEntryProcessor 创建了用于更新 map 条目的自定义条目处理器。当我的应用程序在两个实例上的集群中运行并且执行入口处理器时,我收到以下异常: com.haze
我的本地环境:OSX 10.9.2,java1.6 我使用 java api 连接 hbase 和 maven 来管理我的项目,我将 Hbase-0.94.17 和 Hadoop-core-1.0
包装一些生成的类,我使用 classImpl 绑定(bind),但生成的类中的集合返回生成的类型而不是 classImpl 中的类型,我当然想要一个 classImpl 列表...... 我的 xsd
我正在编写一个守护程序来获取某些游戏的服务器统计信息。 在编译中我收到一条消息: cannot access org.apache.commons.pool2.impl.GenericObjectPo
我最近将旧应用程序的后台服务迁移到 WorkManager .在最近的设备上(低至 sdk 22 包括 )它看起来不错,运行重复的工作单元并按预期在设备重新启动时安排它们。 问题是当我测试旧版本时(旧
这个问题在这里已经有了答案: Xerces error: org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl (2 个答案) 关闭 5 年前。 我正在使用
如果我有一个需要Default实现的结构,如果所有字段的类型都有Default实现的themsevles,那么我可以使用derive 宏,否则我需要手动实现 Default。但是,在某些情况下,我有一
我看到 Rust 代码库中经常出现以下模式,但我找不到解释为什么要使用它。 将 impl ... for 用于什么目的? build ? 伪代码: impl Handler { pub fn
我用 Angular js 编写了一些小代码。它有效,但我收到一些错误“无法读取未定义的属性'impl'”。有人知道那是什么吗? 这是我的 html:
我正在尝试创建一个通用实现,用于根据不同的字段类型生成 From/Into。 Link to Playground 我发现了以下问题: error[E0425]: cannot find value
在下面传递一个trait作为参数的例子中,在函数签名中发送impl需要什么? 我知道 traits 是更通用的类型而不是具体类型,但是由于 Rust 编译器不允许跨结构和 traits 共享名称,为什
我有一个带有两个通用 typenum 参数的实现。当参数相同时,impl 的函数应该返回不同的类型。 (不同类型是一种更紧凑的表示,只有当类型参数相同时才能实现。)是否可以使用基于类型相等性的不同实现
我是一名优秀的程序员,十分优秀!