微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JAXB - anyType - Duplicite 命名空间前缀 - 复杂的解决方案

如何解决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 举报,一经查实,本站将立刻删除。