Hello Users,

I am facing problems retrieving the value of ArrayList of Object Array using client stubs generated using WSDL2Java. The ObjectArray has just a string in it.

I have a method in my WebService that returns an java.util.ArrayList of ObjectArray. For this I have written serializer for ArrayList and defined the ArrayOfObject in my wsdl file as shown below

<complexType name="ArrayList">
    <all>
         <element name="item" minOccurs="0" maxOccurs="unbounded" type="xsd:anyType"/>
    </all>
</complexType>

<complexType name="ArrayOfObject">
    <complexContent>
                <restriction base="soapenc:Array">
                    <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:anyType[]"/>
                </restriction>
    </complexContent>
</complexType>

The ArrayList.java that is generated is attached with this mail.

What is happening is I only get the String present in the last ObjectArray added in the ArrayList. When I have a ArrayList that contains String I am able to fetch all the values.

For further reference please refer the tcpmon response for ArrayList of String and ArrayList of ObjectArray below

----------ArrayList with ObjectArray---------------

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <ns1:invokeResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://localhost:7001/jmx/soapServices/AdventNetSoapAgent">
   <invokeReturn href=""/>
  </ns1:invokeResponse>
  <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:ArrayList" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="urn:AdventNetSoapAgentTypes">
   <item xsi:type="ns2:ArrayOfObject">
    <item xsi:type="xsd:string">33333333</item>
   </item>
   <item xsi:type="ns2:ArrayOfObject">
    <item xsi:type="xsd:string">222222222</item>
   </item>
   <item xsi:type="ns2:ArrayOfObject">
    <item xsi:type="xsd:string">334444444</item>
   </item>
  </multiRef>
 </soapenv:Body>
</soapenv:Envelope>

----------ArrayList with ObjectArray---------------

----------ArrayList with String---------------

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <ns1:invokeResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://localhost:7001/jmx/soapServices/AdventNetSoapAgent">
   <invokeReturn href=""/>
  </ns1:invokeResponse>
  <multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns2:ArrayList" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="urn:AdventNetSoapAgentTypes">
   <item xsi:type="xsd:string">33333333</item>
   <item xsi:type="xsd:string">222222222</item>
   <item xsi:type="xsd:string">334444444</item>
  </multiRef>
 </soapenv:Body>
</soapenv:Envelope>

----------ArrayList with String---------------

I tried some debugging by putting print statements in the setItem method of ArrayList stub.

I found that for ArrayList with three Strings the method gets called three times with the Object[] passed having 1,2 and 3 elements it. That is in the third call the Object[] passed has all the 3 Strings in it.

But for ArrayList with Object[] in it, though the setItem method gets called three times the Object[] passed has only one element in it. So only the last element gets stored in the ArrayList stub.

Hope I am clear.

I am using AXIS1.0 version.

Is this an issue with AXIS or am I missing something.

Please help as this is urgent to me.

Thanks,

--
Signature -------------------------------------------------------
Jagannath.C
AdventNet ManageEngine JMX Studio
Off : 2243115 Extn:5252
Nortel: +91-925-895-6380
www.adventnet.com
-------------------------------------------------------
/**
 * ArrayList.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis WSDL2Java emitter.
 */

package AdventNetSoapAgentTypes;

public class ArrayList  implements java.io.Serializable {
    private java.lang.Object[] item;

    public ArrayList() {
    }

    public java.lang.Object[] getItem() {
        return item;
    }

    public void setItem(java.lang.Object[] item) {
        System.out.println("ArrayList: Inside setItem "+item.length);
        this.item = item;
    }

    public java.lang.Object getItem(int i) {
        return item[i];
    }

    public void setItem(int i, java.lang.Object value) {
        this.item[i] = value;
    }

    private java.lang.Object __equalsCalc = null;
    public synchronized boolean equals(java.lang.Object obj) {
        if (!(obj instanceof ArrayList)) return false;
        ArrayList other = (ArrayList) obj;
        if (obj == null) return false;
        if (this == obj) return true;
        if (__equalsCalc != null) {
            return (__equalsCalc == obj);
        }
        __equalsCalc = obj;
        boolean _equals;
        _equals = true && 
            ((item==null && other.getItem()==null) || 
             (item!=null &&
              java.util.Arrays.equals(item, other.getItem())));
        __equalsCalc = null;
        return _equals;
    }

    private boolean __hashCodeCalc = false;
    public synchronized int hashCode() {
        if (__hashCodeCalc) {
            return 0;
        }
        __hashCodeCalc = true;
        int _hashCode = 1;
        if (getItem() != null) {
            for (int i=0;
                 i<java.lang.reflect.Array.getLength(getItem());
                 i++) {
                java.lang.Object obj = java.lang.reflect.Array.get(getItem(), i);
                if (obj != null &&
                    !obj.getClass().isArray()) {
                    _hashCode += obj.hashCode();
                }
            }
        }
        __hashCodeCalc = false;
        return _hashCode;
    }

    // Type metadata
    private static org.apache.axis.description.TypeDesc typeDesc =
        new org.apache.axis.description.TypeDesc(ArrayList.class);

    static {
        org.apache.axis.description.FieldDesc field = new 
org.apache.axis.description.ElementDesc();
        field.setFieldName("item");
        field.setXmlName(new javax.xml.namespace.QName("", "item"));
        field.setMinOccursIs0(true);
        typeDesc.addFieldDesc(field);
    };

    /**
     * Return type metadata object
     */
    public static org.apache.axis.description.TypeDesc getTypeDesc() {
        return typeDesc;
    }

    /**
     * Get Custom Serializer
     */
    public static org.apache.axis.encoding.Serializer getSerializer(
           java.lang.String mechType, 
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return 
          new  org.apache.axis.encoding.ser.BeanSerializer(
            _javaType, _xmlType, typeDesc);
    }

    /**
     * Get Custom Deserializer
     */
    public static org.apache.axis.encoding.Deserializer getDeserializer(
           java.lang.String mechType, 
           java.lang.Class _javaType,  
           javax.xml.namespace.QName _xmlType) {
        return 
          new  org.apache.axis.encoding.ser.BeanDeserializer(
            _javaType, _xmlType, typeDesc);
    }

}

Reply via email to