[ http://jira.codehaus.org/browse/XFIRE-839?page=comments#action_85153 ] 
            
Joost den Boer commented on XFIRE-839:
--------------------------------------

I did some more tests.
If I remove the ResultImpl binding, in the WSDL the ResultStringListUoCode 
element still refers to ResultImpl and the specific binding for the 
ResultStringListUoCode.result property is still not in the WSDL. And thus the 
problem as described above still occurs.

Only when I define ResultStringListUoCode to implement IResult and NOT extend 
ResultImpl anymore, the result is as expected. Now the WSDL does show the 
correct ResultStringListUoCode properties and in the XML the Hashtable value 
contains a List of UoCode objects.

WSDL now contains:
<xsd:complexType name="ResultStringListUoCode">
  <xsd:sequence>
    <xsd:element minOccurs="0" name="errorResult" nillable="true" 
type="tns:string2stringMap"/>
    <xsd:element minOccurs="0" name="result" nillable="true" 
type="tns:string2ArrayOfUoCodeMap"/>
  </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="string2ArrayOfUoCodeMap">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="entry">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element maxOccurs="1" minOccurs="0" name="key" 
type="xsd:string"/>
          <xsd:element maxOccurs="1" minOccurs="0" name="value" 
type="tns:ArrayOfUoCode"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>
  </xsd:sequence>
</xsd:complexType>
<xsd:complexType name="ArrayOfUoCode">
  <xsd:sequence>
    <xsd:element maxOccurs="unbounded" minOccurs="0" name="UoCode" 
nillable="true" type="tns:UoCode"/>
  </xsd:sequence>
</xsd:complexType>

XML:
<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="ResultStringListUoCode">
            <errorResult xsi:nil="true"></errorResult>
            <result>
               <entry>
                  <key>VoCodeList</key>
                  <value>
                     <UoCode xsi:type="UoCode">
                        <code>code1</code>
                        <description>this is code 1</description>
                        <language>nl</language>
                     </UoCode>
                     <UoCode xsi:type="UoCode">
                        <code>code2</code>
                        <description>Eso es code dos</description>
                        <language>es</language>
                     </UoCode>
                  </value>
               </entry>
            </result>
         </out>
      </listCodesResponse>
   </soap:Body></soap:Envelope>


> 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