1

我正在使用 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 类是正确的,并且解组工作正常。

  1. 直接在 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>
    
  2. 在 WSDL 中使用 'ref' 而不是 'type' 直接引用它 -

         <xsd:complexType name="myElementType">
             <xsd:sequence>             
                 <xsd:element ref="MyElementXSD"  minOccurs="1"/>
             </xsd:sequence>
         </xsd:complexType> 
    
  3. 然后生成的类@XmlElement 更改为-

        public class MyElement {
    
           @XmlElement(name = "MyElementXSD", required = true)
           protected MyElementXSD myElementXSD;
        }    
    

但是我不能随意接触提供的 WSDL 和 XSD,因此寻找解决方案/建议,例如将一些参数传递给 CXF maven 插件/使用绑定文件等。

4

0 回答 0