Subclassed POJO not correct in WSDL and webservice XML
------------------------------------------------------

                 Key: XFIRE-839
                 URL: http://jira.codehaus.org/browse/XFIRE-839
             Project: XFire
          Issue Type: Bug
          Components: Aegis Module
    Affects Versions: 1.2.4
         Environment: IBM RAD 6 with WAS 5.1 Test Environment
            Reporter: Joost den Boer
         Assigned To: Dan Diephouse


I have several webservices. All methods return an IResult (=interface). Most 
methods return a ResultImpl object (implements IResult).
The ResultImpl object contains a Hashtable property 'result'. For ResultImpl, 
the Aegis binding defines this property to be of type <String>,<Object>.

ResultImpl binding:
<mappings xmlns:ail="http://www.aegon.com/ail/spil/Service";>
        <mapping name="ail:ResultImpl">

                <!-- ignore succes property. Is determined by errorResult 
value. -->
                <property name="succes" ignore="true"/>
                
                <!-- global -->
                <property name="errorResult" class="java.util.Hashtable" 
                                keyType="java.lang.String"
                                componentType="java.lang.String" />

                <property name="result" class="java.util.Hashtable" 
                                keyType="java.lang.String" 
                                componentType="java.lang.Object" />
        </mapping>
</mappings>

When the server returns a result object containing a Hashtable where the value 
is a List<UoCode>, Aegis somehow returns the List as an ArrayOfString. See XML 
below:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
   <soap:Body>
      <listCodesResponse xmlns="http://www.aegon.com/ail/spil/Service";>
         <out xmlns="http://www.aegon.com/ail/spil/Service"; 
xsi:type="ResultImpl">
            <errorResult xsi:nil="true"></errorResult>
            <result>
               <entry>
                  <key xsi:type="xsd:string">VoCodeList</key>
                  <value xsi:type="ArrayOfString">
                     <string xsi:type="UoCode">
                        <code>code1</code>
                        <description>this is code 1</description>
                        <language>nl</language>
                     </string>
                  </value>
               </entry>
            </result>
         </out>
      </listCodesResponse>
   </soap:Body></soap:Envelope>

On the client, when receiving this xml, a StackOverflowException occurs. As 
soon as it reaches ObjectType.readObject( ..), this method keeps calling itself.
To workaround this problem, I created the ResultStringListUoCode object which 
extends ResultImpl and created a binding for this object which specifies the 
result property to be a Hashtable of type <String,List<UoCode>>.

ResultStringListUoCode binding:
<mappings xmlns:ail="http://www.aegon.com/ail/spil/Service";>
        <mapping name="ail:ResultStringListUoCode">

                <property name="result" class="java.util.Hashtable"
                                keyType="java.lang.String" 
                                componentType="#codes" />
                <component name="codes" class="java.util.List" 
componentType="nl.aegon.spilus.code.UoCode" />

        </mapping>
</mappings>

The WSDL however does NOT show the result property as defined in the 
ResultStringListUoCode binding, but still shows the binding of the parent class 
ResultImpl. See WSDL fragment:
....
<xsd:complexType name="ResultStringListUoCode">
    <xsd:complexContent>
        <xsd:extension base="tns:ResultImpl"/>
    </xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="ResultImpl">
    <xsd:sequence>
        <xsd:element minOccurs="0" name="errorResult" nillable="true" 
type="tns:string2stringMap"/>
        <xsd:element minOccurs="0" name="result" nillable="true" 
type="tns:anyType2anyTypeMap"/>
    </xsd:sequence>
</xsd:complexType>
....

Because the ResultStringListUoCode binding is not used, the List<UoCode> object 
is still returned as a ArrayOfString like in the XML above while the xsi:type 
is ResultStringListUoCode. And therefore the client still has a 
StackOverflowException reading the XML response.

So there are really 2 problems : 
1. If a Map value is a List of Object's, it is returned as an ArrayOfString 
(which causes StackOverflowException on client)
2. A subclass property defined in a binding is not used for WSDL and XML



-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe from this list please visit:

    http://xircles.codehaus.org/manage_email

Reply via email to