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 "Toshiyuki Kimura (JIRA)" <ax...@ws.apache.org> on 2005/02/10 10:23:13 UTC

[jira] Assigned: (AXIS-1809) BeanDeserializer fails to deserialize if element name is "class"

     [ http://issues.apache.org/jira/browse/AXIS-1809?page=history ]

Toshiyuki Kimura reassigned AXIS-1809:
--------------------------------------

    Assign To: Toshiyuki Kimura

Kishimoto-san,

 Thank you for filing this report.
Initially, it was reported at the Japanese Axis Community.
Then, they have a plan to follow up on this issue.

Thanks,
Toshi

> 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
>     Assignee: Toshiyuki Kimura
>     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