You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by Steve McDuff <mc...@ca.ibm.com> on 2006/11/04 23:35:38 UTC

Fw: Proposed bugfix for deserialization of arrays

This is a proposed patch in relationship to defect AXIS-2586

In the class : org.apache.axis.encoding.ser.BeanDeserializer. 
Problem: getDeserializer wasn't getting the right deserializer for array 
types when the xmlType is set. 
Solution: apply the default XML Type when we are getting an array 
deserializer 

I modified the following method (see method comments to know where changes 
were applied). 

    protected Deserializer getDeserializer(QName xmlType, 
                                           Class javaType, 
                                           String href, 
                                           DeserializationContext context) 
{ 
        if (javaType.isArray()) { 
            context.setDestinationClass(javaType); 
        } 
        // See if we have a cached deserializer 
        if (cacheStringDSer != null) { 
            if (String.class.equals(javaType) && 
                href == null && 
                (cacheXMLType == null && xmlType == null || 
                 cacheXMLType != null && cacheXMLType.equals(xmlType))) { 
                cacheStringDSer.reset(); 
                return cacheStringDSer; 
            } 
        } 
 
        Deserializer dSer = null; 

        // MODIFICATION DONE HERE : Added the "&& ! javatype.isArray()" 
part in the line below 
        if (xmlType != null && href == null && ! javatype.isArray() ) { 
            // Use the xmlType to get the deserializer. 
            dSer = context.getDeserializerForType(xmlType); 
        } else { 
            // If the xmlType is not set, get a default xmlType 
            TypeMapping tm = context.getTypeMapping(); 
            QName defaultXMLType = tm.getTypeQName(javaType); 
            // If there is not href, then get the deserializer 
            // using the javaType and default XMLType, 
            // If there is an href, the create the generic 
            // DeserializerImpl and set its default type (the 
            // default type is used if the href'd element does 
            // not have an xsi:type. 
            if (href == null) { 
                dSer = context.getDeserializer(javaType, defaultXMLType); 
            } else { 
                dSer = new DeserializerImpl(); 
                context.setDestinationClass(javaType); 
                dSer.setDefaultType(defaultXMLType); 
            } 
        } 
        if (javaType.equals(String.class) && 
            dSer instanceof SimpleDeserializer) { 
            cacheStringDSer = (SimpleDeserializer) dSer; 
            cacheXMLType = xmlType; 
        } 
        return dSer; 
    } 


Note: The source problem seems to be that the client sends its arrays 
identified with types when special conditions are met.

Steve McDuff