I had the same problem, and someone gave the answer earlier in another
thread.

You need a class that contains only the array and no more attributes with
the standard get/set methods + getX(int i) and setX(int i, X x) methods.

And your MyService class can return this class instead of an array. This
way you will have classes that conform to doc/lit and axis will
serialize/deserialize them correctly.

But I found it easier to start with a wsdl and use WSDL2Java, then axis
generates the java classes correctly.

ie:

    <element name="getDescriptorsResponse">
     <complexType>
      <sequence>
       <element name="descriptors" type="impl:myDescriptorList"/>
      </sequence>
     </complexType>
    </element>
    <complexType name="myDescriptor">
     <sequence>
      <element name="field1" nillable="true" type="xsd:string"/>
      <element name="field2" nillable="true" type="xsd:string"/>
     </sequence>
    </complexType>
    <complexType name="myDescriptorList">
     <sequence>
       <element maxOccurs="unbounded" name="descriptors"
        type="impl:myDescriptor"/>
     </sequence>
    </complexType>



>
>
> My classes
>
>     public class MyService {
>         public MyDescriptor[] getDescriptors() {
>             ...
>         }
>     }
>
>     public class MyDescriptor {
>         private String _field1;
>         private String _field2;
>         ...
>         public String getField1() {
>             return _field1;
>         }
>         ...
>     }
>
>
>>From my deploy.wsdd:
>
>   <service name="MyService" provider="java:RPC"
>    style="wrapped" use="literal">
>
>     <parameter name="wsdlTargetNamespace"
>      value="http://www.schuerig.de/verzeichnisservice"/>
>     <parameter name="wsdlServiceElement" value="VerzeichnisService"/>
>     <parameter name="wsdlServicePort" value="VerzeichnisPort"/>
>
>     <parameter name="className"
>      value="de.schuerig.verzeichnisservice.ws.JaxRpcVerzeichnisService"/>
>
>     <parameter name="wsdlPortType" value="VerzeichnisPortType"/>
>
>     <operation name="getDescriptors"
>       xmlns:operNS="http://www.schuerig.de/myservice";
>       qname="operNS:getDescriptors"
>       returnQName="descriptors"
>       soapAction="getDescriptors">
>     </operation>
>
>     <beanMapping
>       xmlns:ns="http://www.schuerig.de/myservice";
>       qname="ns:descriptor"
>       languageSpecificType="java:de.schuerig.myservice.MyDescriptor"/>
>  ...
>
>
> The relevant portion of the generated WSDL looks like this
>
>    <element name="getDescriptorsResponse">
>     <complexType>
>      <sequence>
>       <element maxOccurs="unbounded" name="descriptors"
>        type="impl:myDescriptor"/>
>      </sequence>
>     </complexType>
>    </element>
>    <complexType name="myDescriptor">
>     <sequence>
>      <element name="field1" nillable="true" type="xsd:string"/>
>      <element name="field2" nillable="true" type="xsd:string"/>
>     </sequence>
>    </complexType>
>
> This already looks fishy. The "descriptors" name doesn't really apply to
> the single items in the sequence, but only to the enclosing complexType
> as a whole.
>
>
> Now, when I call the service, in the SOAP body I get this
>
> <soapenv:Body>
>   <getDescriptorsResponse xmlns="">
>     <descriptors>
>       <item>
>         <field1>...</field1>
>         <field2>...</field2>
>       </item>
>       <item>
>         ...
>       </item>
>       ...
>     </descriptors>
>   </getDescriptorsResponse>
> </soapenv:Body>
>
> which is pretty much what I want, despite my misgivings about the WSDL.
> What I really don't want, though, is the exception I get when I run the
> generated TestCase
>
> org.xml.sax.SAXException: Invalid element in
> de.schuerig.www.verzeichnisservice.VerzeichnisDeskriptor - item
>  at
> org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:223)
>  at
> org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1031)
>  at
> org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
>  at
> org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1140)
>  at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:238)
>  at org.apache.axis.message.RPCElement.getParams(RPCElement.java:386)
>  at org.apache.axis.client.Call.invoke(Call.java:2402)
>  at org.apache.axis.client.Call.invoke(Call.java:2301)
>  at org.apache.axis.client.Call.invoke(Call.java:1758)
>
>
> As far as I understand it, the cause of the problem is how arrays are
> handled here. Axis tries to deserialize the entire return value with a
> BeanSerializer, which can't work. The BeanSerializer applies only to
> single item-elements whereas the enclosing return ought to be handled
> by an ArrayDeserializer.
>
> To me it appears as if Axis is mixing up the types of arrays and their
> elements. Preferably, I hope to be told that the error is on my part
> and that I only need to specify slightly differently what I want in
> order to get it.
>
>
> Michael
>
> --
> Michael Schuerig                 Nothing is as brilliantly adaptive
> mailto:[EMAIL PROTECTED]       as selective stupidity.
> http://www.schuerig.de/michael/    --A.O. Rorty, The Deceptive Self
>

Reply via email to