嵌入式 XSD 中的 JAXB 绑定

rad*_*mpe 5 java xsd wsdl jax-ws jaxb

我有一个wsdl嵌入式xsd.

<wsdl:definitions name="AcmeService"
    targetNamespace="http://www.acme.com/services/Acme/WcfService"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:tns="http://www.acme.com/services/Acme/WcfService"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <xsd:schema targetNamespace="http://www.acme.com/services/Acme/WcfService/Imports">
            <xsd:import schemaLocation="http://services01.acme.com/WebServices/AcmeWcfClient/service/AcmeService.svc?xsd=xsd0" namespace="http://www.acme.com/services/Acme/WcfService" />
            <xsd:import schemaLocation="http://services01.acme.com/WebServices/AcmeWcfClient/service/AcmeService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" />
        </xsd:schema>
    </wsdl:types>
    <!-- Some more WSDL Content -->
</wsdl:definitions>
Run Code Online (Sandbox Code Playgroud)

我的“xsd”包含以下定义:

<xs:schema elementFormDefault="qualified" targetNamespace="http://www.acme.com/services/Acme/WcfService">
    <xs:element name="SetApplication">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="application" nillable="true" type="tns:Application"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="Application">
        <xs:sequence>
            <xs:element minOccurs="0" name="SomeElement" nillable="true" type="xs:string"/>
            <xs:element minOccurs="0" name="AnotherElement" nillable="true" type="xs:string"/>
            <xs:element minOccurs="0" name="AcmeDetails" nillable="true" type="tns:Acme"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Application" nillable="true" type="tns:Application"/>
    <xs:complexType name="Acme">
        <xs:sequence>
            <xs:element minOccurs="0" name="PropertyOne" nillable="true" type="xs:string"/>
            <xs:element minOccurs="0" name="PropertyTwo" nillable="true" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:element name="Acme" nillable="true" type="tns:Acme"/>
    <xs:element name="GetAcmeDetails">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="acme" nillable="true" type="tns:Acme"/> <!-- "acme" name is lowercase on purpose -->
            </xs:sequence>
       </xs:complexType>
    </xs:element>
    <xs:element name="GetAcmeDetailsResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="GetAcmeDetailsResult" nillable="true" type="tns:Acme"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

我的问题来自这样一个事实,即在使用 wsimport 生成服务存根时,我留下了以下定义Acme

@XmlType(name = "Acme", namespace = "http://www.acme.com/services/Acme/WcfService", propOrder = {
Run Code Online (Sandbox Code Playgroud)

问题是,我需要同时AcmeAcmeDetails解析到相同的底层Acme对象。

查看其他几个类似的问题(此处此处此处),我尝试使用以下 XML 创建绑定:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  wsdlLocation="Acme_Service.wsdl">
    <enableWrapperStyle>true</enableWrapperStyle>
    <enableAsyncMapping>false</enableAsyncMapping>
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='Application']/xs:sequence/xs:element[@name='AcmeDetails']">
        <jaxb:class name="AcmeDetails"/>
    </jaxws:bindings>
</jaxws:bindings>
Run Code Online (Sandbox Code Playgroud)

上述绑定生成类“AcmeDetails”,但 XMLType Annotation 仍为“Acme”。

非常感谢在生成与上述摘录Acme和两者之间的绑定方面的任何帮助AcmeDetails

Pet*_*dea 5

可以使用 JAXB 外部绑定声明文件来自定义 WSDL 文件导入的外部 XML 模式文件:

<jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="1.0">
    <jxb:bindings schemaLocation="your-imported-xsd-location" node="/xsd:schema">
        <jxb:schemaBindings>
            <jxb:package name="fromjava.client"/>
        </jxb:schemaBindings>
    </jxb:bindings>
...
</jxb:bindings>
Run Code Online (Sandbox Code Playgroud)

可以使用 -b 开关将外部 JAXB 绑定声明文件传递给 wsimport。有关详细信息,请参阅 JAX-WS 工具文档。

以上摘录来自此链接;虽然很可能适用于您的版本,但您可以仔细检查相同的内容;