[ 
https://issues.apache.org/jira/browse/AXIS2-3797?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

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 element.

> 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 class. 

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: https://issues.apache.org/jira/browse/AXIS2-3797
>             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, TypeTestClient.java
>
>
> I have a simple POJO service with the following method:
> package org.tempuri.test;
> import org.tempuri.test.data.arrays.ArrayOfanyType;
>  
> 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("http://www.serverside.com/articles/introducingAxiom";,
>  "article");
> 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" exception:
> Caused by: javax.xml.stream.XMLStreamException: Unknow type can not serialize
>       at 
> org.apache.axis2.databinding.utils.ConverterUtil.serializeAnyType(ConverterUtil.java:1449)
>       at 
> org.tempuri.test.data.arrays.xsd.ArrayOfanyType.serialize(ArrayOfanyType.java:241)
>       at 
> org.tempuri.test.data.arrays.xsd.ArrayOfanyType.serialize(ArrayOfanyType.java:160)
>       at 
> org.tempuri.test.RetArrayAnyType1D.serialize(RetArrayAnyType1D.java:203)
>       at 
> org.tempuri.test.RetArrayAnyType1D.serialize(RetArrayAnyType1D.java:123)
>       at 
> org.tempuri.test.RetArrayAnyType1D$1.serialize(RetArrayAnyType1D.java:111)
> ...
> 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.

Reply via email to