axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andreas Veithen (JIRA)" <>
Subject [jira] Updated: (AXIS2-3797) "Unknown type can not serialize" Exception
Date Sun, 06 Sep 2009 20:29:57 GMT


Andreas Veithen updated AXIS2-3797:

    Assignee:     (was: Andreas Veithen)

> My interpretation of any type is it has to map to an object. And at runtime this object
can have a simple type or an complex type. i.e. generated ADB bean object in ADB case. 
> eg. 
> if there this and xml schema part like this 
> <xsd:element name="anything" type="xsd:anyType"/> 
> then <anything xsi:type="xsd:string>test<anything> is a valid serialized
xml element. how we going to represent this if we use an OMElement? 

If there is an xsi:type attribute, then ADB should use the mapped Java type to represent the

> And also lets say we get something like this 
> <anything> 
>    <element1>test</element1> 
>    <element2>test</element2> 
> </anything> 
> then how <element1>test</element1><element2>test</element2> going
to represent as an OMElment? 

The OMElement should actually represent the "anything" element. Alternatively it could be
represented using some other object that stores a node list (the child nodes) and a list of
attributes. That is why I asked how this was represented (as an OMElement) in Axis2 1.3.

> In my interpretation anyType is like java.lang.Object. All classes are extend from Object

In Java, classes are derived from java.lang.Object by extension. On the other hand, schema
types are derived from anyType by restriction. They are therefore not comparable.

> when you use anyType for an element it is like using Object type for an java field. At
runtime the element can have any type but the type should be a defined one.

The XML schema specs clearly say that an element declared with anyType can have any content,
and this content is not necessarily described by an existing type. What you are describing
here is not anyType, but <xsd:any processContents="strict"/> (for which ADB actually
uses OMElement, while this should be represented as a Java object).

> And hence you should have a value to xsi:type. 

> I Agree with you that what schema says is ambiguous.

I don't pretend that the schema specs are ambiguous. They are very clear and they make sense
if one avoids comparing the schema type system (which works by restriction and extension)
with the Java type system (which only works by extension).

> This is the only interpretation I can come up with to write a possible 
> implementation. In this way I could interoperate the anyType with the MSFT wsdl where
with OMElement it was not possible.

As I said above, supporting xsi:type correctly is a real improvement, but on the other hand,
considering xsi:type as mandatory is a regression. IMHO the correct approach is as follows:

- The property storing the anyType element should be of type Object.
- During deserialization:
  - If xsi:type is present, map the content to a Java object.
  - Otherwise, map it to an OMElement.
- During serialization:
  - If the property refers to an OMElement, serialize this element and don't add xsi:type.
  - Otherwise, map the Java object to a schema type and serialize it with an xsi:type attribute.

> "Unknown type can not serialize" Exception
> ------------------------------------------
>                 Key: AXIS2-3797
>                 URL:
>             Project: Axis 2.0 (Axis2)
>          Issue Type: Bug
>          Components: adb
>    Affects Versions: 1.4
>         Environment: Axis2 1.4, Tomcat 5.5.26
>            Reporter: Detelin Yordanov
>         Attachments: full stacktrace.txt, TypeTest.aar,
> I have a simple POJO service with the following method:
> package org.tempuri.test;
> import;
> public class TypeTest {
>     public ArrayOfanyType retArrayAnyType1D(ArrayOfanyType inArrayAnyType1D) {
>         return inArrayAnyType1D;
>     }
> }
> The ArrayOfanyType is declared like this:
> public class ArrayOfanyType {
>     private Object[] anyType;
>     public Object[] getAnyType() {
>         if (anyType == null) {
>             anyType = new Object[0];
>         }
>         return this.anyType;
>     }
>     public void setAnyType(Object[] anyType) {
>     	this.anyType = anyType;
>     }
> }
> I deploy this POJO on an Axis2 1.4 runtime running on Tomcat.
> Then I generate a client stub using the following command:
> wsdl2java -ap -o ./generated -s -u -uw -uri http://localhost:8080/axis2-1.4/services/TypeTest?wsdl
> I use the stub to invoke the service passing an OMElement in the Object array:
> OMFactory factory = OMAbstractFactory.getOMFactory();
> OMNamespace ns = factory.createOMNamespace("",
> OMElement articleElement = factory.createOMElement("Article", ns);
> ArrayOfanyType input = new ArrayOfanyType();
> input.setAnyType(new OMElement[]{articleElement});
> stub.retArrayAnyType1D(input);
> While serializing the ArrayOfanyType ADBBean I get an "Unknown type can not serialize"
> Caused by: Unknow type can not serialize
> 	at org.apache.axis2.databinding.utils.ConverterUtil.serializeAnyType(
> 	at
> 	at
> 	at org.tempuri.test.RetArrayAnyType1D.serialize(
> 	at org.tempuri.test.RetArrayAnyType1D.serialize(
> 	at org.tempuri.test.RetArrayAnyType1D$1.serialize(
> ...
> I did not have this problem on Axis2 1.3 so I guess something have been changed in ConverterUtil.

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message