2

I am trying to generate stub webservice code from a wsdl file that I have When I ran the mvn install command originally - it referenced the wsdl had problems with duplicate names. I looked online and realised I needed to use a binding file

I have this setup but unfortunately I am not able to get the code to compile

Here are the relevant details

Pom File Plugin Entry

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <!-- <version>2.5.2</version> -->
    <version>3.1.4</version>
    <executions>
        <execution>
            <id>cxf-codegen</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
            <configuration>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/src/main/resources/wsdl/MyService.wsdl</wsdl>                                  
                        <packagenames>
                            <packagename>com.services.api.myservice.generated</packagename>
                        </packagenames>
                        <bindingFiles>
                            <bindingFile>${basedir}/src/main/resources/wsdl/MyBinding.xml</bindingFile>
                        </bindingFiles>     
                    </wsdlOption>                       
                </wsdlOptions>
            </configuration>
        </execution>
    </executions>
</plugin>

Binding File - MyBinding.xml

<jxb:bindings version="1.0"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:s="http://www.w3.org/2001/XMLSchema"
    wsdlLocation="MyService.wsdl">

    <jxb:bindings> 
        <jxb:bindings node="./s:element[@name='MyAdvancedSearchResult']/s:complexType/s:sequence/s:any[@minOccurs='1']">
            <jxb:property name="ValueAttribute2" />
        </jxb:bindings>     

        <jxb:bindings node=".//s:element[@name='ResponseTable']/s:complexType/s:sequence/s:any[@minOccurs='0']">
            <jxb:property name="responseTable2" />
        </jxb:bindings>     
    </jxb:bindings>
</jxb:bindings>

Wsdl File - MyService.wsdl

<wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
      <s:element name="MyAdvancedSearch">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="keyword" type="s:string" />
            <s:element minOccurs="0" maxOccurs="1" name="corpId" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="MyAdvancedSearchResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="MyAdvancedSearchResult">
              <s:complexType>
                <s:sequence>
                  <s:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.w3.org/2001/XMLSchema" processContents="lax" />
                  <s:any minOccurs="1" namespace="urn:schemas-microsoft-com:xml-diffgram-v1" processContents="lax" />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="getToDoListbyStatus">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="Corpid" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="getToDoListbyStatusResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="getToDoListbyStatusResult" type="tns:ArrayOfActivityToDoListbyStatus" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="ArrayOfActivityToDoListbyStatus">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="unbounded" name="ActivityToDoListbyStatus" nillable="true" type="tns:ActivityToDoListbyStatus" />
        </s:sequence>
      </s:complexType>
      <s:complexType name="ActivityToDoListbyStatus">
        <s:sequence>
          <s:element minOccurs="1" maxOccurs="1" name="ActivityId" type="s:int" />
          <s:element minOccurs="0" maxOccurs="1" name="ActivityName" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="ActivityDesc" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="ActivityLabel" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Code" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="StartDate" />
          <s:element minOccurs="0" maxOccurs="1" name="EndDate" />
          <s:element minOccurs="1" maxOccurs="1" name="Requiredind" type="s:int" />
          <s:element minOccurs="1" maxOccurs="1" name="ExactDueDate" type="s:dateTime" />
          <s:element minOccurs="1" maxOccurs="1" name="Assignedind" type="s:int" />
          <s:element minOccurs="1" maxOccurs="1" name="RegStatus" type="s:int" />
          <s:element minOccurs="1" maxOccurs="1" name="Duration" type="s:float" />
          <s:element minOccurs="0" maxOccurs="1" name="Catagory" type="s:string" />
        </s:sequence>
      </s:complexType>
      <s:element name="reqActAuthHeader" type="tns:reqActAuthHeader" />
      <s:complexType name="reqActAuthHeader">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string" />
        </s:sequence>
        <s:anyAttribute />
      </s:complexType>
      <s:element name="getToDoListbyStatus_LG">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="Corpid" type="s:string" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="getToDoListbyStatus_LGResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="getToDoListbyStatus_LGResult" type="tns:ArrayOfActivityToDoListbyStatus" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="ResponseTable" nillable="true">
        <s:complexType>
          <s:sequence>
            <s:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.w3.org/2001/XMLSchema" processContents="lax" />
            <s:any minOccurs="1" namespace="urn:schemas-microsoft-com:xml-diffgram-v1" processContents="lax" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="ArrayOfActivityToDoListbyStatus" nillable="true" type="tns:ArrayOfActivityToDoListbyStatus" />
    </s:schema>
  </wsdl:types>
  <wsdl:message name="MyAdvancedSearchSoapIn">
    <wsdl:part name="parameters" element="tns:MyAdvancedSearch" />
  </wsdl:message>
  <wsdl:message name="MyAdvancedSearchSoapOut">
    <wsdl:part name="parameters" element="tns:MyAdvancedSearchResponse" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatusSoapIn">
    <wsdl:part name="parameters" element="tns:getToDoListbyStatus" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatusSoapOut">
    <wsdl:part name="parameters" element="tns:getToDoListbyStatusResponse" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatusreqActAuthHeader">
    <wsdl:part name="reqActAuthHeader" element="tns:reqActAuthHeader" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatus_LGSoapIn">
    <wsdl:part name="parameters" element="tns:getToDoListbyStatus_LG" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatus_LGSoapOut">
    <wsdl:part name="parameters" element="tns:getToDoListbyStatus_LGResponse" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatus_LGreqActAuthHeader">
    <wsdl:part name="reqActAuthHeader" element="tns:reqActAuthHeader" />
  </wsdl:message>
  <wsdl:message name="MyAdvancedSearchHttpGetIn">
    <wsdl:part name="keyword" type="s:string" />
    <wsdl:part name="corpId" type="s:string" />
  </wsdl:message>
  <wsdl:message name="MyAdvancedSearchHttpGetOut">
    <wsdl:part name="Body" element="tns:ResponseTable" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatusHttpGetIn">
    <wsdl:part name="Corpid" type="s:string" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatusHttpGetOut">
    <wsdl:part name="Body" element="tns:ArrayOfActivityToDoListbyStatus" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatus_LGHttpGetIn">
    <wsdl:part name="Corpid" type="s:string" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatus_LGHttpGetOut">
    <wsdl:part name="Body" element="tns:ArrayOfActivityToDoListbyStatus" />
  </wsdl:message>
  <wsdl:message name="MyAdvancedSearchHttpPostIn">
    <wsdl:part name="keyword" type="s:string" />
    <wsdl:part name="corpId" type="s:string" />
  </wsdl:message>
  <wsdl:message name="MyAdvancedSearchHttpPostOut">
    <wsdl:part name="Body" element="tns:ResponseTable" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatusHttpPostIn">
    <wsdl:part name="Corpid" type="s:string" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatusHttpPostOut">
    <wsdl:part name="Body" element="tns:ArrayOfActivityToDoListbyStatus" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatus_LGHttpPostIn">
    <wsdl:part name="Corpid" type="s:string" />
  </wsdl:message>
  <wsdl:message name="getToDoListbyStatus_LGHttpPostOut">
    <wsdl:part name="Body" element="tns:ArrayOfActivityToDoListbyStatus" />
  </wsdl:message>
  <wsdl:portType name="MyServiceSoap">
    <wsdl:operation name="MyAdvancedSearch">
      <wsdl:input message="tns:MyAdvancedSearchSoapIn" />
      <wsdl:output message="tns:MyAdvancedSearchSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus">
      <wsdl:input message="tns:getToDoListbyStatusSoapIn" />
      <wsdl:output message="tns:getToDoListbyStatusSoapOut" />
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus_LG">
      <wsdl:input message="tns:getToDoListbyStatus_LGSoapIn" />
      <wsdl:output message="tns:getToDoListbyStatus_LGSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:portType name="MyServiceHttpGet">
    <wsdl:operation name="MyAdvancedSearch">
      <wsdl:input message="tns:MyAdvancedSearchHttpGetIn" />
      <wsdl:output message="tns:MyAdvancedSearchHttpGetOut" />
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus">
      <wsdl:input message="tns:getToDoListbyStatusHttpGetIn" />
      <wsdl:output message="tns:getToDoListbyStatusHttpGetOut" />
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus_LG">
      <wsdl:input message="tns:getToDoListbyStatus_LGHttpGetIn" />
      <wsdl:output message="tns:getToDoListbyStatus_LGHttpGetOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:portType name="MyServiceHttpPost">
    <wsdl:operation name="MyAdvancedSearch">
      <wsdl:input message="tns:MyAdvancedSearchHttpPostIn" />
      <wsdl:output message="tns:MyAdvancedSearchHttpPostOut" />
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus">
      <wsdl:input message="tns:getToDoListbyStatusHttpPostIn" />
      <wsdl:output message="tns:getToDoListbyStatusHttpPostOut" />
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus_LG">
      <wsdl:input message="tns:getToDoListbyStatus_LGHttpPostIn" />
      <wsdl:output message="tns:getToDoListbyStatus_LGHttpPostOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="MyServiceSoap" type="tns:MyServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="MyAdvancedSearch">
      <soap:operation soapAction="http://tempuri.org/MyAdvancedSearch" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus">
      <soap:operation soapAction="http://tempuri.org/getToDoListbyStatus" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
        <soap:header message="tns:getToDoListbyStatusreqActAuthHeader" part="reqActAuthHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus_LG">
      <soap:operation soapAction="http://tempuri.org/getToDoListbyStatus_LG" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
        <soap:header message="tns:getToDoListbyStatus_LGreqActAuthHeader" part="reqActAuthHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="MyServiceSoap12" type="tns:MyServiceSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="MyAdvancedSearch">
      <soap12:operation soapAction="http://tempuri.org/MyAdvancedSearch" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus">
      <soap12:operation soapAction="http://tempuri.org/getToDoListbyStatus" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
        <soap12:header message="tns:getToDoListbyStatusreqActAuthHeader" part="reqActAuthHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus_LG">
      <soap12:operation soapAction="http://tempuri.org/getToDoListbyStatus_LG" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
        <soap12:header message="tns:getToDoListbyStatus_LGreqActAuthHeader" part="reqActAuthHeader" use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="MyServiceHttpGet" type="tns:MyServiceHttpGet">
    <http:binding verb="GET" />
    <wsdl:operation name="MyAdvancedSearch">
      <http:operation location="/MyAdvancedSearch" />
      <wsdl:input>
        <http:urlEncoded />
      </wsdl:input>
      <wsdl:output>
        <mime:mimeXml part="Body" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus">
      <http:operation location="/getToDoListbyStatus" />
      <wsdl:input>
        <http:urlEncoded />
      </wsdl:input>
      <wsdl:output>
        <mime:mimeXml part="Body" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus_LG">
      <http:operation location="/getToDoListbyStatus_LG" />
      <wsdl:input>
        <http:urlEncoded />
      </wsdl:input>
      <wsdl:output>
        <mime:mimeXml part="Body" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="MyServiceHttpPost" type="tns:MyServiceHttpPost">
    <http:binding verb="POST" />
    <wsdl:operation name="MyAdvancedSearch">
      <http:operation location="/MyAdvancedSearch" />
      <wsdl:input>
        <mime:content type="application/x-www-form-urlencoded" />
      </wsdl:input>
      <wsdl:output>
        <mime:mimeXml part="Body" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus">
      <http:operation location="/getToDoListbyStatus" />
      <wsdl:input>
        <mime:content type="application/x-www-form-urlencoded" />
      </wsdl:input>
      <wsdl:output>
        <mime:mimeXml part="Body" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getToDoListbyStatus_LG">
      <http:operation location="/getToDoListbyStatus_LG" />
      <wsdl:input>
        <mime:content type="application/x-www-form-urlencoded" />
      </wsdl:input>
      <wsdl:output>
        <mime:mimeXml part="Body" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="MyService">
    <wsdl:port name="MyServiceSoap" binding="tns:MyServiceSoap">
      <soap:address location="http://test.com/Myservice.asmx" />
    </wsdl:port>
    <wsdl:port name="MyServiceSoap12" binding="tns:MyServiceSoap12">
      <soap12:address location="http://test.com/Myservice.asmx" />
    </wsdl:port>
    <wsdl:port name="MyServiceHttpGet" binding="tns:MyServiceHttpGet">
      <http:address location="http://test.com/Myservice.asmx" />
    </wsdl:port>
    <wsdl:port name="MyServiceHttpPost" binding="tns:MyServiceHttpPost">
      <http:address location="http://test.com/Myservice.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

When I run mvn install - I get the following errors - Any idea what I need to do to resolve this?

XPath evaluation of "./s:element[@name='MyAdvancedSearchResult']/s:complexType/s:sequence/s:any[@minOccurs='1']" results in empty target node
XPath evaluation of ".//s:element[@name='ResponseTable']/s:complexType/s:sequence/s:any[@minOccurs='0']" results in empty target node
sanastasiadis
  • 1,182
  • 1
  • 15
  • 23
Damien
  • 4,081
  • 12
  • 75
  • 126
  • This is a useful SO question with an example on how to create bindings: http://stackoverflow.com/questions/26653666/wsdl-with-duplicate-names-how-to-force-java-class-names – sanastasiadis Dec 07 '15 at 16:46

2 Answers2

1

I can propose the following version of your MyBinding.xml, in order to resolve the errors you encounter at the moment. I just replaced:

  • ./ with // and
  • .// with //.

So, you need anywhere in the file. I hope this is what you want.

<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:s="http://www.w3.org/2001/XMLSchema"
wsdlLocation="MyService.wsdl">

<jxb:bindings> 
   <jxb:bindings node="//s:element[@name='MyAdvancedSearchResult']/s:complexType/s:sequence/s:any[@minOccurs='1']">
        <jxb:property name="ValueAttribute2" />
    </jxb:bindings>     

     <jxb:bindings node="//s:element[@name='ResponseTable']/s:complexType/s:sequence/s:any[@minOccurs='0']">
        <jxb:property name="responseTable2" />
    </jxb:bindings>     
</jxb:bindings>

sanastasiadis
  • 1,182
  • 1
  • 15
  • 23
  • I tried this but unfortunately this did not resolve the issue – Damien Dec 07 '15 at 14:28
  • Apologies for the delay - too many projects on the go. I had a chance to look at this again and your solution has worked. Apologies - i must have had a typo in my code with the rush – Damien Dec 17 '15 at 21:21
  • Please check again. I managed to generate the code with the provided files and with the other solution I provided. Not this one. – sanastasiadis Dec 18 '15 at 08:06
1

My previous answer was more to fix the XPath issue, and indeed the XPath issue was fixed, but still the code could not be generated.

I liked the issue and I wanted to give it one more try. I created a simple project with your files, and given that the wsdl is provided by the 3rd party service provider, and it cannot be changed, I revised the MyBinding.xml file only and I managed to generate the code successfully. Here is the version of the MyBinding.xml file I came up with:

<jxb:bindings schemaLocation="MyService.wsdl#types1">
    <jxb:bindings xmlns:s="http://www.w3.org/2001/XMLSchema"
        node="//s:element[@name='MyAdvancedSearchResponse']/s:complexType/s:sequence/s:element[@name='MyAdvancedSearchResult']/s:complexType/s:sequence/s:any[@minOccurs='1']">
        <jxb:property name="ValueAttribute2" />
    </jxb:bindings>
    <jxb:bindings xmlns:s="http://www.w3.org/2001/XMLSchema"
        node="//s:element[@name='ResponseTable']/s:complexType/s:sequence/s:any[@minOccurs='1']">
        <jxb:property name="responseTable2" />
    </jxb:bindings>
</jxb:bindings>

This is a SO question that I used as a reference.

Community
  • 1
  • 1
sanastasiadis
  • 1,182
  • 1
  • 15
  • 23