BeanDeserializer cannot deserialize the array in the complex type 
------------------------------------------------------------------

         Key: AXIS-2340
         URL: http://issues.apache.org/jira/browse/AXIS-2340
     Project: Apache Axis
        Type: Bug
  Components: Basic Architecture  
    Versions: 1.3    
    Reporter: Dmytro Dyachuk
    Priority: Blocker


The problem is the BeanSerializer throws an exception during deserializing the 
SOAP response on the clients stub. It seems that it tries to cast to some type 
"[J" which is definately is not long.

The soap message is:
<?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:createOrderResponse 
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"; 
xmlns:ns1="http://tpcapp.kvn.usask.ca";>
            <createOrderReturn href="#id0"/>
         </ns1:createOrderResponse>
         <multiRef id="id0" soapenc:root="0" 
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"; 
xsi:type="ns2:CreateOrderResponse" 
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"; 
xmlns:ns2="structs.kvn.usask.ca">
            <systemId xsi:type="xsd:string" xsi:nil="true"/>
            <orderId xsi:type="xsd:long">740488771</orderId>
            <orderStatus xsi:type="xsd:string">PENDING</orderStatus>
            <orederTotal xsi:type="xsd:double">72875.404390735</orederTotal>
            <orderTax xsi:type="xsd:double">12442.961820735</orderTax>
            <orderShipCost xsi:type="xsd:double">28154.98</orderShipCost>
            <discount xsi:type="xsd:double">42.34</discount>
            <itemId xsi:type="xsd:long">7838</itemId>
            <itemId xsi:type="xsd:long">78844</itemId>
            <itemId xsi:type="xsd:long">50151</itemId>
            <itemId xsi:type="xsd:long">80088</itemId>
            <itemId xsi:type="xsd:long">88702</itemId>
            <itemId xsi:type="xsd:long">64908</itemId>
            <itemQty xsi:type="xsd:long">2</itemQty>
            <itemQty xsi:type="xsd:long">6</itemQty>
            <itemQty xsi:type="xsd:long">6</itemQty>
            <itemQty xsi:type="xsd:long">1</itemQty>
            <itemQty xsi:type="xsd:long">7</itemQty>
            <itemQty xsi:type="xsd:long">4</itemQty>
            <itemCost xsi:type="xsd:double">455.28</itemCost>
            <itemCost xsi:type="xsd:double">1935.29</itemCost>
            <itemCost xsi:type="xsd:double">3383.91</itemCost>
            <itemCost xsi:type="xsd:double">98.62</itemCost>
            <itemCost xsi:type="xsd:double">2256.43</itemCost>
            <itemCost xsi:type="xsd:double">1814.89</itemCost>
            <itemStatus xsi:type="xsd:string">PENDING</itemStatus>
            <itemStatus xsi:type="xsd:string">PENDING</itemStatus>
            <itemStatus xsi:type="xsd:string">PENDING</itemStatus>
            <itemStatus xsi:type="xsd:string">PENDING</itemStatus>
            <itemStatus xsi:type="xsd:string">PENDING</itemStatus>
            <itemStatus xsi:type="xsd:string">PENDING</itemStatus>
         </multiRef>
      </soapenv:Body>
   </soapenv:Envelope>
The exception:
- Could not convert java.lang.Long to bean field 'itemId', type [J
- Exception:
java.lang.IllegalArgumentException: argument type mismatch
        at 
org.apache.axis.encoding.ser.BeanPropertyTarget.set(BeanPropertyTarget.java:157)
        at 
org.apache.axis.encoding.DeserializerImpl.valueComplete(DeserializerImpl.java:249)
        at 
org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.java:509)
        at 
org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
        at 
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:171)
        at 
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)
        at 
org.apache.axis.encoding.DeserializerImpl.startElement(DeserializerImpl.java:369)
        at 
org.apache.axis.encoding.ser.BeanDeserializer.startElement(BeanDeserializer.java:154)
        at 
org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1048)
        at 
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
        at 
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)
        at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236)
        at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)
        at org.apache.axis.client.Call.invoke(Call.java:2467)
        at org.apache.axis.client.Call.invoke(Call.java:2366)
        at org.apache.axis.client.Call.invoke(Call.java:1812)
        at 
ca.usask.kvn.tpcapp.client.axis.BookStoreService.BookStoreServiceSoapBindingStub.createOrder(BookStoreServiceSoapBindingStub.java:603)
        at 
ca.usask.kvn.tpcapp.client.BookstoreClient.createNewOrder(BookstoreClient.java:135)
        at ca.usask.kvn.tpcapp.client.ClientSuite.main(ClientSuite.java:55)


The code of the generated stub:
/**
 * CreateOrderResponse.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis 1.3 Oct 05, 2005 (05:23:37 EDT) WSDL2Java emitter.
 */

package ca.usask.kvn.tpcapp.client.axis.structs;

public class CreateOrderResponse  extends 
ca.usask.kvn.tpcapp.client.axis.structs.Response  implements 
java.io.Serializable {
    private long orderId;

    private java.lang.String orderStatus;

    private double orederTotal;

    private double orderTax;

    private double orderShipCost;

    private double discount;

    private long[] itemId;

    private long[] itemQty;

    private double[] itemCost;

    private java.lang.String[] itemStatus;

    public CreateOrderResponse() {
    }

    public CreateOrderResponse(
           java.lang.String systemId,
           long orderId,
           java.lang.String orderStatus,
           double orederTotal,
           double orderTax,
           double orderShipCost,
           double discount,
           long[] itemId,
           long[] itemQty,
           double[] itemCost,
           java.lang.String[] itemStatus) {
        super(
            systemId);
        this.orderId = orderId;
        this.orderStatus = orderStatus;
        this.orederTotal = orederTotal;
        this.orderTax = orderTax;
        this.orderShipCost = orderShipCost;
        this.discount = discount;
        this.itemId = itemId;
        this.itemQty = itemQty;
        this.itemCost = itemCost;
        this.itemStatus = itemStatus;
    }


    /**
     * Gets the orderId value for this CreateOrderResponse.
     * 
     * @return orderId
     */
    public long getOrderId() {
        return orderId;
    }


    /**
     * Sets the orderId value for this CreateOrderResponse.
     * 
     * @param orderId
     */
    public void setOrderId(long orderId) {
        this.orderId = orderId;
    }


    /**
     * Gets the orderStatus value for this CreateOrderResponse.
     * 
     * @return orderStatus
     */
    public java.lang.String getOrderStatus() {
        return orderStatus;
    }


    /**
     * Sets the orderStatus value for this CreateOrderResponse.
     * 
     * @param orderStatus
     */
    public void setOrderStatus(java.lang.String orderStatus) {
        this.orderStatus = orderStatus;
    }


    /**
     * Gets the orederTotal value for this CreateOrderResponse.
     * 
     * @return orederTotal
     */
    public double getOrederTotal() {
        return orederTotal;
    }


    /**
     * Sets the orederTotal value for this CreateOrderResponse.
     * 
     * @param orederTotal
     */
    public void setOrederTotal(double orederTotal) {
        this.orederTotal = orederTotal;
    }


    /**
     * Gets the orderTax value for this CreateOrderResponse.
     * 
     * @return orderTax
     */
    public double getOrderTax() {
        return orderTax;
    }


    /**
     * Sets the orderTax value for this CreateOrderResponse.
     * 
     * @param orderTax
     */
    public void setOrderTax(double orderTax) {
        this.orderTax = orderTax;
    }


    /**
     * Gets the orderShipCost value for this CreateOrderResponse.
     * 
     * @return orderShipCost
     */
    public double getOrderShipCost() {
        return orderShipCost;
    }


    /**
     * Sets the orderShipCost value for this CreateOrderResponse.
     * 
     * @param orderShipCost
     */
    public void setOrderShipCost(double orderShipCost) {
        this.orderShipCost = orderShipCost;
    }


    /**
     * Gets the discount value for this CreateOrderResponse.
     * 
     * @return discount
     */
    public double getDiscount() {
        return discount;
    }


    /**
     * Sets the discount value for this CreateOrderResponse.
     * 
     * @param discount
     */
    public void setDiscount(double discount) {
        this.discount = discount;
    }


    /**
     * Gets the itemId value for this CreateOrderResponse.
     * 
     * @return itemId
     */
    public long[] getItemId() {
        return itemId;
    }


    /**
     * Sets the itemId value for this CreateOrderResponse.
     * 
     * @param itemId
     */
    public void setItemId(long[] itemId) {
        this.itemId = itemId;
    }


    /**
     * Gets the itemQty value for this CreateOrderResponse.
     * 
     * @return itemQty
     */
    public long[] getItemQty() {
        return itemQty;
    }


    /**
     * Sets the itemQty value for this CreateOrderResponse.
     * 
     * @param itemQty
     */
    public void setItemQty(long[] itemQty) {
        this.itemQty = itemQty;
    }


    /**
     * Gets the itemCost value for this CreateOrderResponse.
     * 
     * @return itemCost
     */
    public double[] getItemCost() {
        return itemCost;
    }


    /**
     * Sets the itemCost value for this CreateOrderResponse.
     * 
     * @param itemCost
     */
    public void setItemCost(double[] itemCost) {
        this.itemCost = itemCost;
    }


    /**
     * Gets the itemStatus value for this CreateOrderResponse.
     * 
     * @return itemStatus
     */
    public java.lang.String[] getItemStatus() {
        return itemStatus;
    }


    /**
     * Sets the itemStatus value for this CreateOrderResponse.
     * 
     * @param itemStatus
     */
    public void setItemStatus(java.lang.String[] itemStatus) {
        this.itemStatus = itemStatus;
    }

    private java.lang.Object __equalsCalc = null;
    public synchronized boolean equals(java.lang.Object obj) {
        if (!(obj instanceof CreateOrderResponse)) return false;
        CreateOrderResponse other = (CreateOrderResponse) obj;
        if (obj == null) return false;
        if (this == obj) return true;
        if (__equalsCalc != null) {
            return (__equalsCalc == obj);
        }
        __equalsCalc = obj;
        boolean _equals;
        _equals = super.equals(obj) && 
            this.orderId == other.getOrderId() &&
            ((this.orderStatus==null && other.getOrderStatus()==null) || 
             (this.orderStatus!=null &&
              this.orderStatus.equals(other.getOrderStatus()))) &&
            this.orederTotal == other.getOrederTotal() &&
            this.orderTax == other.getOrderTax() &&
            this.orderShipCost == other.getOrderShipCost() &&
            this.discount == other.getDiscount() &&
            ((this.itemId==null && other.getItemId()==null) || 
             (this.itemId!=null &&
              java.util.Arrays.equals(this.itemId, other.getItemId()))) &&
            ((this.itemQty==null && other.getItemQty()==null) || 
             (this.itemQty!=null &&
              java.util.Arrays.equals(this.itemQty, other.getItemQty()))) &&
            ((this.itemCost==null && other.getItemCost()==null) || 
             (this.itemCost!=null &&
              java.util.Arrays.equals(this.itemCost, other.getItemCost()))) &&
            ((this.itemStatus==null && other.getItemStatus()==null) || 
             (this.itemStatus!=null &&
              java.util.Arrays.equals(this.itemStatus, other.getItemStatus())));
        __equalsCalc = null;
        return _equals;
    }

    private boolean __hashCodeCalc = false;
    public synchronized int hashCode() {
        if (__hashCodeCalc) {
            return 0;
        }
        __hashCodeCalc = true;
        int _hashCode = super.hashCode();
        _hashCode += new Long(getOrderId()).hashCode();
        if (getOrderStatus() != null) {
            _hashCode += getOrderStatus().hashCode();
        }
        _hashCode += new Double(getOrederTotal()).hashCode();
        _hashCode += new Double(getOrderTax()).hashCode();
        _hashCode += new Double(getOrderShipCost()).hashCode();
        _hashCode += new Double(getDiscount()).hashCode();
        if (getItemId() != null) {
            for (int i=0;
                 i<java.lang.reflect.Array.getLength(getItemId());
                 i++) {
                java.lang.Object obj = java.lang.reflect.Array.get(getItemId(), 
i);
                if (obj != null &&
                    !obj.getClass().isArray()) {
                    _hashCode += obj.hashCode();
                }
            }
        }
        if (getItemQty() != null) {
            for (int i=0;
                 i<java.lang.reflect.Array.getLength(getItemQty());
                 i++) {
                java.lang.Object obj = 
java.lang.reflect.Array.get(getItemQty(), i);
                if (obj != null &&
                    !obj.getClass().isArray()) {
                    _hashCode += obj.hashCode();
                }
            }
        }
        if (getItemCost() != null) {
            for (int i=0;
                 i<java.lang.reflect.Array.getLength(getItemCost());
                 i++) {
                java.lang.Object obj = 
java.lang.reflect.Array.get(getItemCost(), i);
                if (obj != null &&
                    !obj.getClass().isArray()) {
                    _hashCode += obj.hashCode();
                }
            }
        }
        if (getItemStatus() != null) {
            for (int i=0;
                 i<java.lang.reflect.Array.getLength(getItemStatus());
                 i++) {
                java.lang.Object obj = 
java.lang.reflect.Array.get(getItemStatus(), 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(CreateOrderResponse.class, 
true);

    static {
        typeDesc.setXmlType(new 
javax.xml.namespace.QName("structs.kvn.usask.ca", "CreateOrderResponse"));
        org.apache.axis.description.ElementDesc elemField = new 
org.apache.axis.description.ElementDesc();
        elemField.setFieldName("orderId");
        elemField.setXmlName(new javax.xml.namespace.QName("", "orderId"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "long"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("orderStatus");
        elemField.setXmlName(new javax.xml.namespace.QName("", "orderStatus"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "string"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("orederTotal");
        elemField.setXmlName(new javax.xml.namespace.QName("", "orederTotal"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "double"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("orderTax");
        elemField.setXmlName(new javax.xml.namespace.QName("", "orderTax"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "double"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("orderShipCost");
        elemField.setXmlName(new javax.xml.namespace.QName("", 
"orderShipCost"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "double"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("discount");
        elemField.setXmlName(new javax.xml.namespace.QName("", "discount"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "double"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("itemId");
        elemField.setXmlName(new javax.xml.namespace.QName("", "itemId"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "long"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("itemQty");
        elemField.setXmlName(new javax.xml.namespace.QName("", "itemQty"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "long"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("itemCost");
        elemField.setXmlName(new javax.xml.namespace.QName("", "itemCost"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "double"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
        elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("itemStatus");
        elemField.setXmlName(new javax.xml.namespace.QName("", "itemStatus"));
        elemField.setXmlType(new 
javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema";, "string"));
        elemField.setNillable(true);
        typeDesc.addFieldDesc(elemField);
    }

    /**
     * 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);
    }

}




-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to