Home

XML & Web services: Returning java.util.List in Axis

  1. Returning java.util.List in Axis (3 messages)

    Hi,

    When I generate the classes using a WSDL I get a return type of Object[] instead of the java.util.List object. From what I understand List is serializable.

    Any reason why it is changing the return type to Object[]?

    Thanks,

    -Ray

    Threaded Messages (3)

  2. Returning java.util.List in Axis[ Go to top ]

    Here's a little more info on this subject:

    Java interface used to generate WSDL.
    //**** iDAO.java
    import java.util.List;

    public interface iDAO {
            public List executeQuery(String s);
            public int executeUpdate(String s);
    }


    WSDL file generate by running Java2WSDL using iDAO.class (above)
    //****daoservice.wsdl
    <?xml version="1.0" encoding="UTF-8"?>
    <wsdl:definitions targetNamespace="http://Interface.daopackage" xmlns:impl="http://Interface.daopackage" xmlns:intf="http://Interface.daopackage" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
       <wsdl:message name="executeUpdateResponse">
          <wsdl:part name="executeUpdateReturn" type="xsd:int"/>
       </wsdl:message>
       <wsdl:message name="executeQueryResponse">
          <wsdl:part name="executeQueryReturn" type="soapenc:Array"/>
       </wsdl:message>
       <wsdl:message name="executeQueryRequest">
          <wsdl:part name="in0" type="xsd:string"/>
       </wsdl:message>
       <wsdl:message name="executeUpdateRequest">
          <wsdl:part name="in0" type="xsd:string"/>
       </wsdl:message>
       <wsdl:portType name="iDAO">
          <wsdl:operation name="executeQuery" parameterOrder="in0">
             <wsdl:input name="executeQueryRequest" message="impl:executeQueryRequest"/>
             <wsdl:output name="executeQueryResponse" message="impl:executeQueryResponse"/>
          </wsdl:operation>
          <wsdl:operation name="executeUpdate" parameterOrder="in0">
             <wsdl:input name="executeUpdateRequest" message="impl:executeUpdateRequest"/>
             <wsdl:output name="executeUpdateResponse" message="impl:executeUpdateResponse"/>
          </wsdl:operation>
       </wsdl:portType>
       <wsdl:binding name="DAOServiceSoapBinding" type="impl:iDAO">
          <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
          <wsdl:operation name="executeQuery">
             <wsdlsoap:operation soapAction=""/>
             <wsdl:input name="executeQueryRequest">
                <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://Interface.daopackage"/>
             </wsdl:input>
             <wsdl:output name="executeQueryResponse">
                <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://Interface.daopackage"/>
             </wsdl:output>
          </wsdl:operation>
          <wsdl:operation name="executeUpdate">
             <wsdlsoap:operation soapAction=""/>
             <wsdl:input name="executeUpdateRequest">
                <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://Interface.daopackage"/>
             </wsdl:input>
             <wsdl:output name="executeUpdateResponse">
                <wsdlsoap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://Interface.daopackage"/>
             </wsdl:output>
          </wsdl:operation>
       </wsdl:binding>
       <wsdl:service name="iDAOService">
          <wsdl:port name="DAOService" binding="impl:DAOServiceSoapBinding">
             <wsdlsoap:address location="http://thehost:8082/axis/services/DAOService"/>
          </wsdl:port>
       </wsdl:service>
    </wsdl:definitions>


    IDAO.java generated by running WSDL2Java using above WSDL.
    /**
     * IDAO.java
     *
     * This file was auto-generated from WSDL
     * by the Apache Axis WSDL2Java emitter.
     */

    package com.rf3labs.services.dbconn.dao.ws;

    public interface IDAO extends java.rmi.Remote {
        public java.lang.Object[] executeQuery(java.lang.String in0) throws java.rmi.RemoteException;
        public int executeUpdate(java.lang.String in0) throws java.rmi.RemoteException;
    }

    You will notice that the return type of executeQuery method is java.lang.Object[] rather than what was defined in iDAO.java interface whic is java.util.List.
  3. Returning java.util.List in Axis[ Go to top ]

    Ray:
        Axis generates client-side classes from the service's WSDL. In the WSDL you have NO WAY of knowing how is a collection (list, set or whatever) implemented in the server-side. So, Axis makes a choice and returns Object[].
        What if you're trying to use a third-party WebService? You don't know if it is implemented in Java (where you have java.util.List) or COBOL (where you have something else I don't know).
        I believe there's some weird way to plug your own code generator into WSDL2Java, if you MUST use java.util.List.

    Regards,
    Martin
  4. Returning java.util.List in Axis[ Go to top ]

    Check this link:

    http://www-106.ibm.com/developerworks/xml/library/ws-tip-roundtrip1.html

    I think ur problem is similiar to the one expalined in the article....