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