You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by "B.C. Holmes" <bc...@bcholmes.org> on 2006/03/04 20:34:43 UTC

SAXException: Amazon.com Web Services using Axis 1.3

I'm trying to invoke Amazon's Web Services using Axis (for Java) 1.3.  
I've downloaded their WSDL, run WSDL2Java, and created a simple test 
case.  When I run the test case, I keep running into the following 
exception as Axis parses the response from the server:

org.xml.sax.SAXException: Invalid element in 
ca.intelliware.amazonapi.Items - IsValid

I've used a proxy tool to capture the SOAP messages going back and 
forth, and based on my reading of the WSDL, the format is fine.  Also, 
the error message suggests that the code is working with the wrong 
object type.  Here's the snippet of the SOAP message that's significant:

<Items>
  <Request>
    <IsValid>True</IsValid>
  </Request>
  <Item>
  ...
  </Item>
</Items>

I would expect, therefore, that Axis should be working with a Request 
class, rather than an Items class.

I've tried some searches on this mailing list, and while there are some 
similar problems reported, I haven't been able to see anything that 
suggests the answer.

Here are some sanity checks I've tried:

1. The Request class looks properly created, and contains an isValid 
(String) member variable and appropriate getter/setter.

2. The Items class looks properly created and does not contain an 
isValid member variable (correctly, I believe).

3. The WSDL includes the following:

<xs:element name="Request">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="IsValid" type="xs:string" minOccurs="0"/>
      <xs:element name="HelpRequest" type="tns:HelpRequest" minOccurs="0"/>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:element>

4. I tried downloading and using Axis 1.2.1, but WSDL2Java didn't seem 
to generate versions of the client bindings that'd properly compile.

5. I've tracked the Exception down to these lines in 
BeanDeserializer.onStartChild(...):

        if (propDesc == null) {
            // No such field
            throw new SAXException(
                    Messages.getMessage("badElem00", javaType.getName(),
                                         localName));
        }

      When I set a breakpoint there in my debugger, I find that the 
javaType of the BeanDeserializer is Items (not Request). 

      Does anyone know what might cause this?

BC


Here's my SOAP request:

<?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">
<soapenv:Body>
<ItemLookup 
xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-13">
  <AWSAccessKeyId>$MY_ACCESS_KEY</AWSAccessKeyId>
  <Shared>
    <ItemId>0321278658</ItemId>
  </Shared>
  </ItemLookup>
</soapenv:Body>
</soapenv:Envelope>


Here's the response:


<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Body>
<ItemLookupResponse 
xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-13">
<OperationRequest>
  <HTTPHeaders>
    <Header Name="UserAgent" Value="Axis/1.3"></Header>
  </HTTPHeaders>
  <RequestId>0SSYXJZE5DFVK083SPCW</RequestId>
  <Arguments>
    <Argument Name="Service" Value="AWSECommerceService"></Argument>
  </Arguments>
  <RequestProcessingTime>0.0151088237762451</RequestProcessingTime>
</OperationRequest>
<Items>
  <Request>
    <IsValid>True</IsValid>
  </Request>
  <Item>
    <ASIN>0321278658</ASIN>
    <DetailPageURL> ... very long url ... </DetailPageURL>
    <ItemAttributes>
      <Author>Kent Beck</Author>
      <Author>Cynthia Andres</Author>
      <ProductGroup>Book</ProductGroup>
      <Title>Extreme Programming Explained : Embrace Change (2nd 
Edition)</Title>
    </ItemAttributes>
  </Item>
</Items>
</ItemLookupResponse>
</SOAP-ENV:Body></SOAP-ENV:Envelope>


Here's my stack trace:

org.xml.sax.SAXException: Invalid element in 
ca.intelliware.amazonapi.Items - IsValid
    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)
    at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236)
    at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)
    at org.apache.axis.client.Call.invoke(Call.java:2467)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at 
ca.intelliware.amazonapi.AWSECommerceServiceBindingStub.itemLookup(AWSECommerceServiceBindingStub.java:2380)
    at 
ca.intelliware.amazonapi.AWSECommerceServiceTest.testAWSECommerceService(AWSECommerceServiceTest.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
    at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
    at 
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)



And my WSDL can be found here:

http://webservices.amazon.com/AWSECommerceService/AWSECommerceService.wsdl




-- 
B.C. Holmes             \u2625                  http://www.bcholmes.org/ 
"Sel pa vante tèt li di li sale"
               -- Haitian proverb