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>