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(DeserializerImpl
.java:249)
at
org.apache.axis.encoding.ser.ArrayDeserializer.valueComplete(ArrayDeseri
alizer.java:583)
at
org.apache.axis.encoding.DeserializerImpl.endElement(DeserializerImpl.ja
va:509)
at
org.apache.axis.encoding.DeserializationContext.endElement(Deserializati
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.