Axis generated wsdl does not include all type definitions

1.2k views Asked by At

I am using Axis 1.1 with Java 1.4. My code is being integrated into a large off the shelf system and I can't upgrade either of these components.

I have the following class, and am exposing the UpdateChartOfAccounts method through an Axis web service.

public class ChartOfAccountsWebService
{
    public WSResponse[] UpdateChartOfAccounts(WSCostCenter[] costCenters) throws Exception{     
        WSResponse[] responses = new WSResponse[costCenters.length];

            //logic removed

        return responses;
    }

    public class WSCostCenter{
        public String costCenter;
        public String costCenterDesc;
        public String approver;
        public String companyNumber;
        public String inactiveFlag; 
    }

    public class WSResponse{
        public String ID;
        public String col;
        public String colValue;
        public String[] errors;
        public int lineNum;
        public int recNum;
    }
}

In my server-config.wsdd I've added the following block, which does allow me to see the service and request it's wsdl:

 <service name="ChartOfAccountsWebService" provider="java:RPC">
  <parameter name="allowedMethods" value="UpdateChartOfAccounts"/>
  <parameter name="className" value="com.integration.webservices.ChartOfAccountsWebService"/>
  <parameter name="scope" value="Application"/>
 </service>

This generates the following WSDL, which has no definition for either WSCostCenter or WSResponse:

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://localhost:7001/services/ChartOfAccountsWebService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:7001/services/ChartOfAccountsWebService" xmlns:intf="http://localhost:7001/services/ChartOfAccountsWebService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <schema targetNamespace="http://localhost:7001/services/ChartOfAccountsWebService" xmlns="http://www.w3.org/2001/XMLSchema">
            <import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
            <complexType name="ArrayOf_tns1_ChartOfAccountsWebService_WSCostCenter">
                <complexContent>
                    <restriction base="soapenc:Array">
                        <attribute ref="soapenc:arrayType" wsdl:arrayType="tns1:ChartOfAccountsWebService_WSCostCenter[]"/>
                    </restriction>
                </complexContent>
            </complexType>
            <complexType name="ArrayOf_tns1_ChartOfAccountsWebService_WSResponse">
                <complexContent>
                    <restriction base="soapenc:Array">
                        <attribute ref="soapenc:arrayType" wsdl:arrayType="tns1:ChartOfAccountsWebService_WSResponse[]"/>
                    </restriction>
                </complexContent>
            </complexType>
        </schema>
    </wsdl:types>
    <wsdl:message name="UpdateChartOfAccountsResponse">
        <wsdl:part name="UpdateChartOfAccountsReturn" type="impl:ArrayOf_tns1_ChartOfAccountsWebService_WSResponse"/>
    </wsdl:message>
    <wsdl:message name="UpdateChartOfAccountsRequest">
        <wsdl:part name="costCenters" type="impl:ArrayOf_tns1_ChartOfAccountsWebService_WSCostCenter"/>
    </wsdl:message>
    <wsdl:portType name="ChartOfAccountsWebService">
        <wsdl:operation name="UpdateChartOfAccounts" parameterOrder="costCenters">
            <wsdl:input message="impl:UpdateChartOfAccountsRequest" name="UpdateChartOfAccountsRequest"/>
            <wsdl:output message="impl:UpdateChartOfAccountsResponse" name="UpdateChartOfAccountsResponse"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="ChartOfAccountsWebServiceSoapBinding" type="impl:ChartOfAccountsWebService">
        <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="UpdateChartOfAccounts">
            <wsdlsoap:operation soapAction=""/>
            <wsdl:input name="UpdateChartOfAccountsRequest">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://webservices.integration" use="encoded"/>
            </wsdl:input>
            <wsdl:output name="UpdateChartOfAccountsResponse">
                <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:7001/services/ChartOfAccountsWebService" use="encoded"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="ChartOfAccountsWebServiceService">
        <wsdl:port binding="impl:ChartOfAccountsWebServiceSoapBinding" name="ChartOfAccountsWebService">
            <wsdlsoap:address location="http://localhost:7001/services/ChartOfAccountsWebService"/>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

Why are type definitions missing for WSConstCenter and WSResponse? This service as it is doesn't generate proper code if you try to consume it.

1

There are 1 answers

0
Peter On

Axis doesn't like my nested classes. When I pulled the two inner classes out into their own java files then the WSDL generated correctly:

public class ChartOfAccountsWebService
{
    public WSResponse[] UpdateChartOfAccounts(WSCostCenter[] costCenters) throws Exception{     
        WSResponse[] responses = new WSResponse[costCenters.length];

            //logic removed

        return responses;
    }
}

public class WSCostCenter{
    public String costCenter;
    public String costCenterDesc;
    public String approver;
    public String companyNumber;
    public String inactiveFlag; 
}

public class WSResponse{
    public String ID;
    public String col;
    public String colValue;
    public String[] errors;
    public int lineNum;
    public int recNum;
}