1

I am using Apache CXF maven cxf-codegen-plugin (wsdl2java) to generate JAXB classes from wsdl which includes external XSD and uses the complex type in XSD to define element.

pom.xml Snippet -

        <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>

Generated MyElement.java -

     public class MyElement {

          @XmlElement(name = "MyElementXSD", namespace="", required = true)
          protected MyElementXSD myElementXSD;
     }  

With these WSDL and XSD, generated JAXB class has explicitly empty namespace which is causing issue during unmarshalling.

If I modify WSDL and XSD as below, generated JAXB class is proper and unmarshalling works just fine.

  1. Create element of complex type directly in 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. Refer to it directly using 'ref' instead of 'type' in WSDL -

         <xsd:complexType name="myElementType">
             <xsd:sequence>             
                 <xsd:element ref="MyElementXSD"  minOccurs="1"/>
             </xsd:sequence>
         </xsd:complexType> 
    
  3. Then generated class @XmlElement changes to -

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

But I am not at liberty to touch provided WSDLs and XSDs, hence looking for solutions/suggestions such as passing some argument to CXF maven plugin/using a binding file etc.

0 Answers0