BeanDeserializer fails to deserialize if element name is "class"
----------------------------------------------------------------

         Key: AXIS-1809
         URL: http://issues.apache.org/jira/browse/AXIS-1809
     Project: Axis
        Type: Bug
  Components: Serialization/Deserialization  
    Versions: current (nightly)    
 Environment: Linux, Sun J2SE 1.4.2_06-b03
    Reporter: Makoto Kishimoto
    Priority: Minor


When deserializing xsd:any type element, if the top level element's
element name is "class", BeanDeserializer throws NullPointerException.

Because "class" is a property name of any Beans have, logic of near of
following code looks fail.

BeanDeserializer#onStartChild()
----
    if (propDesc == null) {
        // look for a field by this name.
        propDesc = (BeanPropertyDescriptor) propertyMap.get(localName);
    }

    // try and see if this is an xsd:any namespace="##any" element before
    // reporting a problem
    if (propDesc == null) {
        // try to put unknown elements into a SOAPElement property, if
        // appropriate
        propDesc = getAnyPropertyDesc();
        if (propDesc != null) {
            try {
----

java.lang.NullPointerException
        at 
org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:269)
        at 
org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
        at 
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
        at 
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1140)
        at 
org.apache.axis.encoding.DeserializerImpl.startElement(DeserializerImpl.java:369)
        at 
org.apache.axis.encoding.ser.BeanDeserializer.startElement(BeanDeserializer.java:130)
        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:1140)
        at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:347)
        at org.apache.axis.message.RPCElement.getParams(RPCElement.java:386)
        at org.apache.axis.client.Call.invoke(Call.java:2437)
        at org.apache.axis.client.Call.invoke(Call.java:2336)
        at org.apache.axis.client.Call.invoke(Call.java:1793)
        at BarTest.main(BarTest.java:32)

To reproduce, please use following sample.
----
deploy.wsdd
--
<deployment xmlns="http://xml.apache.org/axis/wsdd/"; 
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java";>
    <service name="BarPort" provider="java:RPC" style="rpc" use="encoded">
        <parameter name="className" value="com.example.bar.BarImpl"/>
        <parameter name="allowedMethods" value="testOp"/>
        <beanMapping qname="bar:TestOpResponse" 
xmlns:bar="http://example.com/bar"; 
languageSpecificType="java:com.example.bar.TestOpResponse"/>
    </service>
</deployment>

----
com/example/bar/BarImpl.java
--
package com.example.bar;

import org.apache.axis.message.MessageElement;

public class BarImpl {
    public TestOpResponse testOp() {
        final TestOpResponse response = new TestOpResponse();
        response.set_any(new MessageElement[] {new MessageElement("", 
"class")});
        return response;
    }
}

----
com/example/bar/TestOpResponse.java
--
package com.example.bar;

import org.apache.axis.description.TypeDesc;
import org.apache.axis.message.MessageElement;

public class TestOpResponse {
    private MessageElement[] _any;

    public MessageElement[] get_any() {
        return _any;
    }

    public void set_any(MessageElement[] _any) {
        this._any = _any;
    }

    private static TypeDesc typeDesc = new TypeDesc(TestOpResponse.class, true);

    static {
        typeDesc.setXmlType(new 
javax.xml.namespace.QName("http://example.com/bar";, "TestOpResponse"));
    }

    public static TypeDesc getTypeDesc() {
        return typeDesc;
    }
}

----
BarTest.java
--
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import javax.xml.namespace.QName;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.MessageElement;

import com.example.bar.TestOpResponse;

public class BarTest {
    public static void main(String[] args) throws Exception {
        Service service = new Service();
        Call call = (Call)service.createCall();
        QName testOpResponseQName = new QName("http://example.com/bar";, 
"TestOpResponse");
        call.registerTypeMapping(
            TestOpResponse.class,
            testOpResponseQName,
            new org.apache.axis.encoding.ser.BeanSerializerFactory(
                TestOpResponse.class,
                testOpResponseQName),
            new org.apache.axis.encoding.ser.BeanDeserializerFactory(
                TestOpResponse.class,
                testOpResponseQName));
        call.setTargetEndpointAddress(new 
URL("http://localhost:8080/axis/services/BarPort";));
        call.setOperationName(new QName("", "testOp"));
        call.setReturnType(testOpResponseQName, TestOpResponse.class);
        TestOpResponse result = (TestOpResponse)call.invoke(new Object[0]);
        if (result != null) {
            MessageElement[] messageElements = result.get_any();
            if (messageElements != null) {
                List elementList = 
Collections.synchronizedList(Arrays.asList(messageElements));
                synchronized (elementList) {
                    for (
                                Iterator iter = elementList.iterator();
                                iter.hasNext();
                                ) {
                        System.out.println(iter.next());
                    }
                }
            }
        }
    }
}

----

-- 
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
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira

Reply via email to