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