我正在使用 Apache CXF maven cxf-codegen-plugin (wsdl2java) 从包含外部 XSD 的 wsdl 生成 JAXB 类,并使用 XSD 中的复杂类型来定义元素。
pom.xml 片段 -
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<wsdlOption>
<wsdl>${base.wsdl.path}/myWSDL.wsdl</wsdl>
<extraargs>
<extraarg>-p</extraarg>
<extraarg>${base.package.name}.mywsdl</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
myWSDL.wsdl Snippet-
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="myService"
targetNamespace="http://com.company/myservice/schemas">
<wsdl:types>
<xs:schema xmlns="http://com.company/myservice/schemas"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://com.company/myservice/schemas">
<xsd:include schemaLocation="myXSD.xsd"/>
<xsd:complexType name="myElementType">
<xsd:sequence>
<xsd:element name="MyElementXSD" type="MyElementComplexTypeFromXSD" minOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<xs:element name="MyElement" type="myElementType"/>
...
...
</xs:schema>
</wsdl:types>
myXSD.xsd -
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://com.company/myservice/schemas" targetNamespace="http://com.company/myservice/schemas">
<complexType name="MyElementComplexTypeFromXSD">
<attribute name="MyAttribute" type="string"/>
</complexType>
</schema>
生成 MyElement.java -
public class MyElement {
@XmlElement(name = "MyElementXSD", namespace="", required = true)
protected MyElementXSD myElementXSD;
}
使用这些 WSDL 和 XSD,生成的 JAXB 类具有明确的空命名空间,这会在解组期间引起问题。
如果我如下修改 WSDL 和 XSD,生成的 JAXB 类是正确的,并且解组工作正常。
直接在 XSD 中创建复杂类型的元素 -
<?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://com.company/myservice/schemas" targetNamespace="http://com.company/myservice/schemas"> <element name="MyElementXSD"> <complexType > <attribute name="MyAttribute" type="string"/> </complexType> </element> </schema>
在 WSDL 中使用 'ref' 而不是 'type' 直接引用它 -
<xsd:complexType name="myElementType"> <xsd:sequence> <xsd:element ref="MyElementXSD" minOccurs="1"/> </xsd:sequence> </xsd:complexType>
然后生成的类@XmlElement 更改为-
public class MyElement { @XmlElement(name = "MyElementXSD", required = true) protected MyElementXSD myElementXSD; }
但是我不能随意接触提供的 WSDL 和 XSD,因此寻找解决方案/建议,例如将一些参数传递给 CXF maven 插件/使用绑定文件等。