> -----Original Message-----
> From: KARR, DAVID (ATTCINW)
> Sent: Thursday, July 30, 2009 11:01 AM
> To: axis-user@ws.apache.org
> Subject: Reexamining problem with Axis not generating container
> 
> A couple weeks ago I posted a note about a problem (title "Axis skips
> generating type if it thinks it can just make an array") where Axis
1.3
> doesn't generate a container class if an element only has a single
> child.  I had thought the problem was just annoying, but now I'm
seeing
> it's more serious than that.  Axis fails to deserialize legal XML if I
> don't add a kludge element to make it create the container class.
> 
> When I generate code for the following:
> 
> <xs:complexType name="SomethingItemPropertyListInfo">
>   <xs:sequence>
>     <xs:element name="PropertyData" type="SomethingPropertyInfo"
>                 minOccurs="0" maxOccurs="unbounded"/>
>     <xs:element name="Dummy" type="xs:boolean" minOccurs="0"/>
>   </xs:sequence>
> </xs:complexType>
> 
> It generates a container class corresponding to the "PropertyData"
> element, and the class corresponding to the
> "SomethingItemPropertyListInfo" element has a data element of that
> type.
> 
> If I comment out the "Dummy" element, however, the data element in the
> class corresponding to the "SomethingItemPropertyListInfo" element is
> simply an array of "SomethingPropertyInfo".
> 
> This is annoying, but it's not fatal, as I can just change code
> references, depending on whether a container class was generated or
> not.
> 
> What is fatal is that when I don't have the "Dummy" element defined,
> then legal XML using these structures (note that "Dummy" is optional,
> so
> it doesn't need to be present in the data) fails to deserialize,
> throwing an exception like the following:
> 
> ---------------------
> 2009-07-30 09:49:29,551 ERROR
> [org.apache.axis.encoding.ser.BeanPropertyTarget] [set] [Thread:main]
-
> [Could not convert
> [Lcom.company.interfaces.csi.soap.types.SomethingServicePropertyInfo;
> to
> bean field 'itemPropertyListData', type
> [Lcom.company.interfaces.csi.soap.types.SomethingServicePropertyInfo;]
> 2009-07-30 09:49:29,551 ERROR [org.apache.axis.client.Call] [invoke]
> [Thread:main] - [Exception:]
> java.lang.IllegalArgumentException: argument type mismatch
>       at
>
org.apache.axis.encoding.ser.BeanPropertyTarget.set(BeanPropertyTarget.
> j
> ava:157)
>       at
>
org.apache.axis.encoding.DeserializerImpl.valueComplete(DeserializerImp
> l
> .java:249)
>       at
>
org.apache.axis.encoding.ser.ArrayDeserializer.valueComplete(ArrayDeser
> i
> alizer.java:583)
>       at
>
org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.j
> a
> va:509)
>       at
>
org.apache.axis.encoding.DeserializationContext.endElement(Deserializat
> i
> onContext.java:1087)
>       at
>
org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java
> :
> 171)
>       at
>
org.apache.axis.message.MessageElement.publishToHandler(MessageElement.
> j
> ava:1141)
>       at
> org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236)
>       at
> org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)
>       at org.apache.axis.client.Call.invoke(Call.java:2467)
>       at org.apache.axis.client.Call.invoke(Call.java:2366)
>       at org.apache.axis.client.Call.invoke(Call.java:1812)
> --------------------
> 
> If I'm understanding this correctly, this error message is saying that
> I
> have a value of type "SomethingServicePropertyInfo[]", and I'm trying
> to
> assign it to a field named "itemPropertyListData", which is of type
> "SomethingServicePropertyInfo[]".  I must be misunderstanding this,
> because I don't see how that could fail to convert.

If it matters, I've done some additional debugging and determined a
little more information.

The problem appears to occur when you have nested unbounded
(maxOccurs=unbounded) elements.  This produces a situation where a
generated instance variable and setter is of type "Name[][]"
(two-dimensional array).  Unfortunately, the resulting value to be
inserted is a "Name[]" (one-dimensional array).  In addition, the error
message that Axis constructs is incorrect.  The error message it
generates is the following:

"Could not convert
[Lcom.company.interfaces.csi.soap.types.SomethingServicePropertyInfo; to
bean field 'itemPropertyListData', type
[Lcom.company.interfaces.csi.soap.types.SomethingServicePropertyInfo;]"

But it should have been (notice the one "[" changing to "[["):

"Could not convert
[Lcom.company.interfaces.csi.soap.types.SomethingServicePropertyInfo; to
bean field 'itemPropertyListData', type
[[Lcom.company.interfaces.csi.soap.types.SomethingServicePropertyInfo;]"

Reply via email to