You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Jeff <je...@cogentlogic.com> on 2004/01/06 23:06:49 UTC

SimpleDeserializer encountered a child element... documentation!

Hi!

When invoking a method from the client, it's possible to get the following error if type mappings have not been registered:

    "SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize."

This is solved by calling registerTypeMapping() against the org.apache.axis.client.Call object BUT ONLY if you know what to pass as parameters!

>From the JavaDoc, the second parameter for registerTypeMapping() is called xmlType and is defined to be:

    "the xsi:type QName of the associated XML type"

which, while being correct, is incomplete (or misleading for simple folks like me).

Similarly, the WSDD documentation for:

     <typeMapping qname="ns:localName" classname="classname" serializer="classname" deserializer="classname"/>

namely:

    "Each typeMapping maps an XML qualified name to/from a Java class, using a specified Serializer and Deserializer."

while being more ambiguous and, paradoxically, more comprehensive, is, nonetheless, still far from illuminating!

Examining that part of org.apache.axis.client.Call.invoke() that makes use of type mappings, namely:

    dser = context.getDeserializerForType(qname);

in:
    org.apache.axis.message.RPCHandler.onStartChild()

it is apparent that a match is sought for an XML element name, not an XML type name. (Of course, some folks might argue that elements are types but, while that isn't an unreasonable stance, it is certainly confusing when dealing with XML Schema.)

Unfortunately, I had been supplying an XML Schema complex type name rather than an element name to registerTypeMapping() and getting the "SimpleDeserializer encountered a child element..." error.

In my case, this is wrong:

    call.registerTypeMapping(net.opengis.www.sensorML.SensorType.class, new javax.xml.namespace.QName("http://www.opengis.net/sensorML", "SensorType"), beansf, beandf);

and this is right:

    call.registerTypeMapping(net.opengis.www.sensorML.SensorType.class, new javax.xml.namespace.QName("http://www.opengis.net/sensorML", "Sensor"), beansf, beandf);


Since the class DescribeSensorResponseType, which aggregates a SensorType object, was generated by WSDL2Java and contains the Sensor/SensorType mapping, vis:

    org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
    elemField.setFieldName("sensor");
    elemField.setXmlName(new javax.xml.namespace.QName("http://www.opengis.net/sensorML", "Sensor"));
    elemField.setXmlType(new javax.xml.namespace.QName("http://www.opengis.net/sensorML", "SensorType"));
    typeDesc.addFieldDesc(elemField);

I had been under the illusion that org.apache.axis.client.Call could make the association and it didn't occur to me to use "Sensor" rather than "SensorType" in registerTypeMapping().


I shall be grateful if the registerTypeMapping() JavaDoc could be updated to something like:

    xmlType - the xsi:type QName of the associated XML type or, in the case of complex types, the QName of the associated XML element.

I shall also be grateful if someone could point me to where this is documented, if it is; that way I might not be so dumb in the future!


Warmest regards,

Jeff Lawson
Cogent Logic Corporation
Toronto, Canada






Re: SimpleDeserializer encountered a child element... documentation!

Posted by Airline Pedestal <ai...@yahoo.com>.
+1 to the confusion factor of all this
type mapping stuff.  I've been going round
and round trying to figure out how the settings
on the Call object and the settings in the
WSDD file should be configured.  Could someone please
explain how this works?


-A



--- Jeff <je...@cogentlogic.com> wrote:
> Hi!
> 
> When invoking a method from the client, it's
> possible to get the following error if type mappings
> have not been registered:
> 
>     "SimpleDeserializer encountered a child element,
> which is NOT expected, in something it was trying to
> deserialize."
> 
> This is solved by calling registerTypeMapping()
> against the org.apache.axis.client.Call object BUT
> ONLY if you know what to pass as parameters!
> 
> From the JavaDoc, the second parameter for
> registerTypeMapping() is called xmlType and is
> defined to be:
> 
>     "the xsi:type QName of the associated XML type"
> 
> which, while being correct, is incomplete (or
> misleading for simple folks like me).
> 
> Similarly, the WSDD documentation for:
> 
>      <typeMapping qname="ns:localName"
> classname="classname" serializer="classname"
> deserializer="classname"/>
> 
> namely:
> 
>     "Each typeMapping maps an XML qualified name
> to/from a Java class, using a specified Serializer
> and Deserializer."
> 
> while being more ambiguous and, paradoxically, more
> comprehensive, is, nonetheless, still far from
> illuminating!
> 
> Examining that part of
> org.apache.axis.client.Call.invoke() that makes use
> of type mappings, namely:
> 
>     dser = context.getDeserializerForType(qname);
> 
> in:
>    
> org.apache.axis.message.RPCHandler.onStartChild()
> 
> it is apparent that a match is sought for an XML
> element name, not an XML type name. (Of course, some
> folks might argue that elements are types but, while
> that isn't an unreasonable stance, it is certainly
> confusing when dealing with XML Schema.)
> 
> Unfortunately, I had been supplying an XML Schema
> complex type name rather than an element name to
> registerTypeMapping() and getting the
> "SimpleDeserializer encountered a child element..."
> error.
> 
> In my case, this is wrong:
> 
>    
>
call.registerTypeMapping(net.opengis.www.sensorML.SensorType.class,
> new
>
javax.xml.namespace.QName("http://www.opengis.net/sensorML",
> "SensorType"), beansf, beandf);
> 
> and this is right:
> 
>    
>
call.registerTypeMapping(net.opengis.www.sensorML.SensorType.class,
> new
>
javax.xml.namespace.QName("http://www.opengis.net/sensorML",
> "Sensor"), beansf, beandf);
> 
> 
> Since the class DescribeSensorResponseType, which
> aggregates a SensorType object, was generated by
> WSDL2Java and contains the Sensor/SensorType
> mapping, vis:
> 
>     org.apache.axis.description.ElementDesc
> elemField = new
> org.apache.axis.description.ElementDesc();
>     elemField.setFieldName("sensor");
>     elemField.setXmlName(new
>
javax.xml.namespace.QName("http://www.opengis.net/sensorML",
> "Sensor"));
>     elemField.setXmlType(new
>
javax.xml.namespace.QName("http://www.opengis.net/sensorML",
> "SensorType"));
>     typeDesc.addFieldDesc(elemField);
> 
> I had been under the illusion that
> org.apache.axis.client.Call could make the
> association and it didn't occur to me to use
> "Sensor" rather than "SensorType" in
> registerTypeMapping().
> 
> 
> I shall be grateful if the registerTypeMapping()
> JavaDoc could be updated to something like:
> 
>     xmlType - the xsi:type QName of the associated
> XML type or, in the case of complex types, the QName
> of the associated XML element.
> 
> I shall also be grateful if someone could point me
> to where this is documented, if it is; that way I
> might not be so dumb in the future!
> 
> 
> Warmest regards,
> 
> Jeff Lawson
> Cogent Logic Corporation
> Toronto, Canada
> 
> 
> 
> 
> 
> 


__________________________________
Do you Yahoo!?
Yahoo! Hotjobs: Enter the "Signing Bonus" Sweepstakes
http://hotjobs.sweepstakes.yahoo.com/signingbonus