axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Ping Ning (JIRA)" <axis-...@ws.apache.org>
Subject [jira] Created: (AXIS-2644) Deserializer omits one layer of elements in the response object
Date Wed, 28 Mar 2007 15:44:25 GMT
Deserializer omits one layer of elements in the response object
---------------------------------------------------------------

                 Key: AXIS-2644
                 URL: https://issues.apache.org/jira/browse/AXIS-2644
             Project: Axis
          Issue Type: Bug
          Components: Serialization/Deserialization
    Affects Versions: 1.4
         Environment: Windows XP/JDK1.4
            Reporter: Ping Ning
            Priority: Critical
             Fix For: 1.4


I define in an XSD a Submission element which contains up to 100 Envelope elements but does
not have
any other elements besides the envelopes, i.e., the Submission element is a pure wrapper container:

<xs:element name="Submission">
<xs:complexType>
  <xs:sequence>
         <xs:element name="Envelope" maxOccurs="100">
                 <xs:complexType>
                           <xs:sequence>
                                     <xs:element name="PlanData">
                                                    <xs:complexType>
                                                               <xs:sequence>
                                                                        <xs:element name="PlanName"
type="xs:string">
                                                                        <xs:element name="PlanStatus"
type="xs:string">
                                                               </xs:sequence>
                                                    </xs:complexType>
                                     </xs:element name="PlanData">
                           </xs:sequence>
                 </xs:complexType>
         </xs:element>
  </xs:sequence>
</xs:complexType>
</xs:element>

The Submission element is used to define a response type in a SOAP message:

<xs:element name="FilingYearResponse" type="FilingYearResponseType"/>
<xs:complexType name="FilingYearResponseType">
    <xs:sequence>
          <xs:element ref="sub:Submission"/>
    </xs:sequence>
</xs:complexType>

WSDL2Java generates one type SubmissionEnvelope:

        typeDesc.setXmlType(new javax.xml.namespace.QName("http://www.pbgc.gov/plan_admin/efiling/Submission",
">>Submission>Envelope"));
        org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
        elemField.setFieldName("planData");
        elemField.setXmlName(new javax.xml.namespace.QName("http://www.pbgc.gov/plan_admin/efiling/Submission",
"PlanData"));
        elemField.setXmlType(new javax.xml.namespace.QName("http://www.pbgc.gov/plan_admin/efiling/Submission",
">>>Submission>Envelope>PlanData"));
        elemField.setNillable(false);
        typeDesc.addFieldDesc(elemField);

The filingYearREsponse object has a getter returning  SubmissionEnvelop[].

The resultant XML message from AXIS is (simplied version without namespace etc.):

<soapenv:Body>
     <FilingYearResponse>
           <Submission>
                 <PlanData>
                        <PlanName>MyPlanName1</PlanName>
                        <PlanStatus>Open</PlanStatus>
                 </PlanData>
           </Submission>
           <Submission>
                 <PlanData>
                        <PlanName>MyPlanName2</PlanName>
                        <PlanStatus>Open</PlanStatus>
                 </PlanData>
           </Submission>
     </FilingYearResponse>
</soapenv:Body>

The Submission and Envelope are collapsed into one layer. What I expect to see is:
<soapenv:Body>
     <FilingYearResponse>
           <Submission>
<Envelope>
                 <PlanData>
                        <PlanName>MyPlanName1</PlanName>
                        <PlanStatus>Open</PlanStatus>
                 </PlanData>
</Envelope>
<!--
           </Submission>
           <Submission>
-->
<Envelope>
                 <PlanData>
                        <PlanName>MyPlanName2</PlanName>
                        <PlanStatus>Open</PlanStatus>
                 </PlanData>
</Envelope>
           </Submission>
     </FilingYearResponse>
</soapenv:Body>

The type mapping seems to have the correct information:

      <typeMapping
        xmlns:ns="http://www.pbgc.gov/plan_admin/efiling/Submission"
        qname="ns:>>Submission>Envelope"
        type="java:gov.pbgc.pps.commonservice.types.submission.SubmissionEnvelope"
        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle=""
      />

The deserializer should create a <Submission> element first, then use the the array
to create a list of <Envelope>
elements under this <Submission> element. The meta data seems to be there in the type
mapping. So my guess is, 
the deserializer does not make use of the meta data properly. 

WSDL2Java could have generated two types, Submission and SubmissionEnvelope. FilingYearREsponse
contains 
a Submission while the Submission element contains an array of SubmissionEnvelope.  That would
have been cleaner. 

But even with the current WSDL2Java generating only one type, the meta data is still sufficient
to generate two levels of 
elements (Submission and Envelope) instead of just one (Submission). It's certainly much more
trickier, because the
deserializer needs to know about generating Submission as a container for an array of SubmissionEnvelopes
that are
mapped to Envelope elements.

Please let me know if there is any way to get around this. Thanks!



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org


Mime
View raw message