I had the following in my WSDL (the complete WSDL is at the end of the mail) :

<xsd:element name="MyComplexReq">
      <xsd:complexType >
        <xsd:all>
          <xsd:element name="subject" type="xsd:string"/>
          <xsd:element name="content" type="xsd:string"/>
          <xsd:element name="card" type="typens:VCardType"/>
        </xsd:all>
      </xsd:complexType>
  </xsd:element>

When I ran WSDL2Java I got a NPE:

java.lang.NullPointerException
        at org.apache.axis.wsdl.symbolTable.Utils.getNodeNameQName(Utils.java:25
9)
        at org.apache.axis.wsdl.symbolTable.SchemaUtils.getElementAnonQName(Sche
maUtils.java:379)
        at org.apache.axis.wsdl.symbolTable.Utils.getTypeQNameFromAttr(Utils.jav
a:401)
        at org.apache.axis.wsdl.symbolTable.Utils.getTypeQName(Utils.java:316)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.createTypeFromRef(Symbol
Table.java:962)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.addTypes(SymbolTable.jav
a:734)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.addTypes(SymbolTable.jav
a:825)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.addTypes(SymbolTable.jav
a:825)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.addTypes(SymbolTable.jav
a:825)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.populateTypes(SymbolTabl
e.java:688)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.jav
a:548)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.add(SymbolTable.java:421
)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.jav
a:408)
        at org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.jav
a:393)
        at org.apache.axis.wsdl.gen.Parser$WSDLRunnable.run(Parser.java:245)

I used Axis 1.1. It looks like in org.apache.axis.wsdl.symbolTable.Utils.getNodeNameQName method, the loop does not handle the anonymous ComplexTypes properly. When I change my WSDL fragment so that the complexType is not anonymous, i.e. I add a name attribute, WSDL2Java is fine e.g.

<xsd:element name="MyComplexReq">
      <xsd:complexType name="MyComplexReqType" >
        <xsd:all>
          <xsd:element name="subject" type="xsd:string"/>
          <xsd:element name="content" type="xsd:string"/>
          <xsd:element name="card" type="typens:VCardType"/>
        </xsd:all>
      </xsd:complexType>
  </xsd:element>

Is this a bug in Utils.java? Or is my WSDL incorrect?

Thanks for any help.

Shantanu Sen

PS. Here is the complete WSDL

<?xml version="1.0" ?>

<definitions name="http://MyService"
             targetNamespace="http://MyService"
             xmlns:tns="http://MyService"
             xmlns:typens="http://MyService"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns="http://schemas.xmlsoap.org/wsdl/">

  <!-- type defs -->
  <types>
    <xsd:schema targetNamespace="http://MyService">
      <xsd:simpleType name="StateType">
        <xsd:restriction base="xsd:string">
          <xsd:enumeration value="CA"/>                     
          <xsd:enumeration value="MA"/>                   
          <xsd:enumeration value="NJ"/>                   
        </xsd:restriction>
      </xsd:simpleType>
      <xsd:complexType name="Phone">
      <xsd:all>
           <xsd:element name="areaCode" type="xsd:int"/>
           <xsd:element name="exchange" type="xsd:string"/>
           <xsd:element name="number" type="xsd:string"/>
        </xsd:all>
      </xsd:complexType>
      <xsd:complexType name="Address">
        <xsd:all>
          <xsd:element name="streetNum" type="xsd:int"/>
          <xsd:element name="streetName" type="xsd:string"/>
          <xsd:element name="city" type="xsd:string"/>
          <xsd:element name="state" type="typens:StateType"/>
          <xsd:element name="zip" type="xsd:int"/>
          <xsd:element name="phoneNumber" type="typens:Phone"/>
        </xsd:all>
      </xsd:complexType>
      <xsd:complexType name="VCardType">
        <xsd:all>
          <xsd:element name="name" type="xsd:string"/>
          <xsd:element name="address" type="typens:Address"/>
        </xsd:all>
      </xsd:complexType>
    </xsd:schema>
   <xsd:element name="VCard" type="typens:VCardType"/>
   <xsd:element name="MyString" type="xsd:string"/>
   <xsd:element name="MyComplexReq">
      <xsd:complexType name="MyComplexReqType" >
        <xsd:all>
          <xsd:element name="subject" type="xsd:string"/>
          <xsd:element name="content" type="xsd:string"/>
          <xsd:element name="card" type="typens:VCardType"/>
        </xsd:all>
      </xsd:complexType>
  </xsd:element>
  <xsd:element name="MyComplexRes">
      <xsd:complexType name="MyComplexResType" >
        <xsd:all>
          <xsd:element name="subject" type="xsd:string"/>
          <xsd:element name="content" type="xsd:string"/>
          <xsd:element name="card" type="typens:VCardType"/>
        </xsd:all>
      </xsd:complexType>
  </xsd:element>
  </types>

  <!-- message declns -->
  <message name="myComplexRequest">
    <part name="parameters" element="typens:MyComplexReq"/>
  </message>

  <message name="MyComplexResponse">
    <part name="parameters" element="typens:MyComplexRes"/>
  </message>

  <message name="MyException">
    <part name="exception" element="typens:MyString"/>
  </message>

  <!-- port type declns -->
  <portType name="MyPort">
    <operation name="myComplexRequest">
      <input message="tns:myComplexRequest"/>
      <output message="tns:MyComplexResponse"/>
    </operation>
  </portType>

  <!-- binding declns -->
  <binding name="MyService_WrappedBinding" type="tns:MyPort">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

    <operation name="myComplexRequest">
      <soap:operation soapAction=""/>
      <input>
        <soap:body use="literal" namespace="http://MyService" />
      </input>

      <output>
        <soap:body use="literal" namespace="http://MyService" />
      </output>
    </operation>


  </binding>

  <!-- service decln -->
  <service name="MyService_WrappedService">
    <port name="MyPort_Wrapped" binding="tns:MyService_WrappedBinding">
      <soap:address location="http://localhost:8080/axis/services/MyPort_Wrapped"/>
    </port>
 </service>

</definitions>

 

 

 

 

 

Reply via email to