如何解决JAXB - anyType - Duplicite 命名空间前缀 - 复杂的解决方案
由于命名空间前缀重复,多个 JAX-WS Web 服务的编排失败。我们有以下 SOAP 网络服务:
输入(入站请求)xsd 片段
<xsd:complexType name="GenerateContractAgreementPDFRequestBody">
<xsd:sequence>
<xsd:element name="document" type="xsd:anyType" />
</xsd:sequence>
</xsd:complexType>
输出(出站请求)xsd 片段
<xs:complexType name="composeSignableDocumentRequestMessageType">
<xs:complexContent>
<xs:extension base="cm:RequestMessage">
<xs:sequence>
<xs:element minOccurs="1" name="documentData" type="xs:anyType" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
使用 wsimport 生成的类型:
生成合同协议PDFRequestBody.java
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "GenerateContractAgreementPDFRequestBody",propOrder = {
"document"
})
public class GenerateContractAgreementPDFRequestBody {
@XmlElement(required = true)
protected Object document;
public Object getDocument() {
return document;
}
public void setDocument(Object value) {
this.document = value;
}
}
ComposeSignableDocumentRequestMessageType.java
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlType(name = "composeSignableDocumentRequestMessageType",propOrder = {
"documentData"
})
public class ComposeSignableDocumentRequestMessageType
extends RequestMessage
{
@XmlElement(required = true)
protected Object documentData;
public Object getDocumentData() {
return documentData;
}
public void setDocumentData(Object value) {
this.documentData = value;
}
}
mapstruct 映射
@Mapper(componentModel = "spring")
public interface OutputManagementServiceMapper {
OutputManagementServiceMapper INSTANCE = Mappers.getMapper(OutputManagementServiceMapper.class);
@Mapping(source = "requestBody.document",target = "documentData")
ComposeSignableDocumentRequestMessageType mapComposeSignableDocumentRequestMessageType(GenerateContractAgreementPDFRequest generateContractAgreementPDFRequest);
}
在 JAXB 对入站请求进行解组后,java.lang.Object 类型的字段文档包含如下所示的 DOM 元素节点:
<ns1:parent xmlns:ns1 = "abc">
<ns1:child xmlns:ns1 = "xyz">
...
</ns1:child>
</ns1:parent>
它生成重复的命名空间前缀。此内容随后被编组并发送到其他 Web 服务,但在解组期间失败并出现格式错误的 xml 异常。
我能够通过手动编辑自动生成的 package-info.java 并添加 XmlNs 注释并使用相应的前缀声明所有 URI 来克服这个问题。可能它可以通过 maven-annotation 插件等实现自动化。
这个问题有什么复杂的解决方案吗?我宁愿不使用 XmlN、NamespacePrefixMapper 对 URI 和前缀进行硬编码或在 bindings.xml 中声明它,如果(并且这可能只是时间问题)有人更改了 xsd 中 anyType 表示的 xml 数据中的命名空间 URI,我也必须更改和重新部署网络服务。我一直在寻找 JAXB 2.2 规范中的预期行为,我觉得这个主题(在 xsd:anyType 中生成命名空间前缀)没有被涵盖。有人可以分享他与其他实现的经验还是这是预期的行为?
WebSphere 8.5.5 (JAXB 2.2) JRE 1.8 随 WebSphere 一起提供
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。