[ 
http://issues.apache.org/jira/browse/AXIS2-632?page=comments#action_12377038 ] 

Chuck Williams commented on AXIS2-632:
--------------------------------------

The issue here is that the wsdl defines the <records> element to be an sObject:

            <complexType name="QueryResult">
                <sequence>
                    <element name="done"         type="xsd:boolean"/>
                    <element name="queryLocator" type="tns:QueryLocator" 
nillable="true"/>
                    <element name="records"      type="ens:sObject" 
nillable="true" minOccurs="0" maxOccurs="unbounded"/>
                    <element name="size"         type="xsd:int"/>
                </sequence>
            </complexType>

and then the message specifies the type to be an sAccount:

    <records xsi:type="sf:Account">
        <sf:Id>0013000000Bnr1qAAB</sf:Id>
        <sf:AccountNumber>axis2Test</sf:AccountNumber>
        <sf:Name>New Account 2</sf:Name>
    </records>

while sObject does not have the AccountNumber or Name property:

            <complexType name="sObject">

                <sequence>

                    <element name="fieldsToNull"       type="xsd:string" 
nillable="true" minOccurs="0" maxOccurs="unbounded"/>

                    <element name="Id"                 type="tns:ID" 
nillable="true" minOccurs="0" maxOccurs="1" />

                </sequence>

            </complexType>

and Account adds them as an extension type:

            <complexType name="Account">
                <complexContent>
                    <extension base="ens:sObject">
                        <sequence>
                        ...
                        <element name="AccountNumber" nillable="true" 
minOccurs="0" type="xsd:string"/>
                        ...
                        <element name="Name" nillable="true" minOccurs="0" 
type="xsd:string"/>
                        ...
                    </extension>
                </complexContent>
            </complexType>

But the generated code is based solely on the declaration of QueryResult and so 
parses the <records> element as an sObject.  sObject does not allow the extra 
properties.  Whence, the exception.

The bottom line is that the current code generator does not support this 
construction with extension types.  Unless this is a required feature for 1.0, 
I'd say this is not a bug.

It could be considered a bug that the error message is not:  "Unexpected 
subelement AccountNumber".  The cause of this could lead to some improper 
behavior in other cases, but never with properly formatted xml.  It's just an 
error recovery/reporting issue.

In looking at this I saw another anomaly that should be corrected.  If you take 
the xml of this example and format it for easy reading, and then try to parse 
it, you get an infinite loop!!  This is not good.  There is one place in the 
template (at least) where an invalid assumption is made that should be fixed.  
It could lead to proper xml not being parsed correctly if it is formatted with 
extra ignorable whitespace.  I'm looking at that now.


> get errors trying to parse valid response
> -----------------------------------------
>
>          Key: AXIS2-632
>          URL: http://issues.apache.org/jira/browse/AXIS2-632
>      Project: Apache Axis 2.0 (Axis2)
>         Type: Bug

>   Components: databinding
>  Environment: Axis2.0 RC4, JDK 1.5.06, WinXP
>     Reporter: Simon Fell
>     Priority: Blocker

>
> A valid response from the query call (wsdl is the enterprise wsdl that's now 
> part of the tests) fails to be de-serialized with an error.
> Exception in thread "main" java.lang.RuntimeException: 
> java.lang.RuntimeException: Unexpected subelement Name
>       at 
> org.apache.axis2.SforceServiceStub.fromOM(SforceServiceStub.java:59718)
>       at org.apache.axis2.SforceServiceStub.query(SforceServiceStub.java:2545)
>       at client.main(client.java:19)
> Caused by: java.lang.RuntimeException: Unexpected subelement Name
>       at 
> org.apache.axis2.SforceServiceStub$QueryResult$Factory.parse(SforceServiceStub.java:57735)
>       at 
> org.apache.axis2.SforceServiceStub$QueryResponse$Factory.parse(SforceServiceStub.java:20706)
>       at 
> org.apache.axis2.SforceServiceStub.fromOM(SforceServiceStub.java:59594)
>       ... 2 more
> Here's the response msg it fails to deserialize
> <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope 
> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; 
> xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
> xmlns="urn:enterprise.soap.sforce.com" 
> xmlns:sf="urn:sobject.enterprise.soap.sforce.com"><soapenv:Body><queryResponse><result><done>true</done><queryLocator
>  xsi:nil="true"/><records 
> xsi:type="sf:Account"><sf:Id>0013000000Bnr1qAAB</sf:Id><sf:AccountNumber>axis2Test</sf:AccountNumber><sf:Name>New
>  Account 2</sf:Name></records><records 
> xsi:type="sf:Account"><sf:Id>0013000000BnspUAAR</sf:Id><sf:AccountNumber>axis2Test</sf:AccountNumber><sf:Name>New
>  Account 
> 1</sf:Name></records><size>2</size></result></queryResponse></soapenv:Body></soapenv:Envelope>
> the client stub was generated with WSDL2Java -s -u -uri enterprise.wsdl
> The test code is
>               SforceServiceStub stub = new SforceServiceStub();
>               SforceServiceStub.Login l = new SforceServiceStub.Login();
>               l.setUsername("*username*");
>               l.setPassword("*password*");
>               SforceServiceStub.LoginResponse lr = stub.login(l);
>               
>               SforceServiceStub.SessionHeader sh = new 
> SforceServiceStub.SessionHeader();
>               sh.setSessionId(lr.getResult().getSessionId());
>               stub = new SforceServiceStub(lr.getResult().getServerUrl());
>               
>               SforceServiceStub.Query q = new SforceServiceStub.Query();
>               q.setQueryString("select id, name, AccountNumber from Account 
> where AccountNumber='axis2Test'");
>               SforceServiceStub.QueryResponse qr = stub.query(q, sh, null);
>               
>               System.out.println("query returned " + qr.getResult().getSize() 
> + " rows");
>               
>               for(SforceServiceStub.SObject o : qr.getResult().getRecords()) {
>                       SforceServiceStub.Account a = 
> (SforceServiceStub.Account)o;
>                       System.out.println(a.getId() + " " + a.getName() + " " 
> + a.getAccountNumber());
>               }
> Also the generated stub has getId() returning an OMElement, and not a string.

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

Reply via email to