Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
1.2.1
-
None
-
None
Description
My WSDL describes an array (this is only a small fragment of the complete WSDL):
<complexType name="PropertyValueDTO">
<sequence>
<element name="URI" type="xsd:boolean"/>
<element name="dateTime" type="xsd:boolean"/>
<element name="hasHistory" type="xsd:boolean"/>
<element name="id" nillable="true" type="xsd:string"/>
<element name="label" nillable="true" type="xsd:string"/>
<element name="source" nillable="true" type="xsd:string"/>
<element name="timestamp" nillable="true" type="xsd:dateTime"/>
<element name="unit" nillable="true" type="xsd:string"/>
<element name="updated" nillable="true" type="xsd:dateTime"/>
<element name="value" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<complexType name="ArrayOfPropertyValueDTO">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="item" type="impl:PropertyValueDTO"/>
</sequence>
</complexType>
<complexType abstract="true" name="TraceableDetailsDTO">
<sequence>
<element name="hasExternalLinks" type="xsd:boolean"/>
<element name="label" nillable="true" type="xsd:string"/>
<element name="properties" nillable="true" type="impl:ArrayOfPropertyValueDTO"/>
</sequence>
</complexType>
When calling the webservice the return looks like this:
<properties>
<properties>
...
</properties>
<properties>
and the client throws the following:
org.xml.sax.SAXException: Invalid element in com.tracetracker.enterprise.twa.ArrayOfPropertyValueDTO - properties
at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:258)
at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)
...
It seems the client expects a structure like this:
<properties>
<item>
...
</item>
<properties>
Having a go at debugging the ArraySerializer I can see in my debugger that both itemQName and componentQName is null, so elementName is never changed from "properties" to "item":
// For the maxOccurs case, each item is named with the QName
// we got in the arguments. For normal array case, we write an element with
// that QName, and then serialize each item as <item>
QName elementName = name;
Attributes serializeAttr = attributes;
if (!maxOccursUsage)
{ serializeAttr = null; // since we are putting them here context.startElement(name, attributes); if (itemQName != null) elementName = itemQName; else if(componentQName != null) elementName = componentQName; }
Can anyone tell me what has gone wrong here?