Hi all,

Some time after posting my question to the newsgroup (at bottom of mail), I
got a reply from Achim Abeling outlining a possible solution.

I'm actually working on a different project at the moment and so haven't
been able to test whether this is actually the right solution, but since it
might be some time before I get to try it out, I thought it worth posting in
case it could help someone else.

Cheers,

Phil

-----Original Message-----
From: Achim Abeling
Sent: 15 June 2004 15:33
To: [EMAIL PROTECTED]
Subject: Re: String[] in complex type was returned as null

Hi Phil,

i got the same problem with a String array.

After a lot of debugging in the Axis code I found that the 
BeanDeserializer did not find an appropriate Deserializer for my String 
array. In my case the SOAP element lacked an xsi:type attribute which 
was the cause, I think.

I managed to get my code doing what I want by
- adding a org.apache.axis.description.TypeDesc for my custom bean. I 
got a hint for that by generating code with wsdl2java and inspecting the 
code created for the bean
- registering a TypeMapping for the String array in the call
call.registerTypeMapping(
        String[].class,
        new javax.xml.namespace.QName(
                "http://www.w3.org/2001/XMLSchema";,
                "string[]"),
        ArraySerializerFactory.class,
        ArrayDeserializerFactory.class);

Perhaps this helps you, too.

I did not manage to mail this directly to the mailing list because I do 
not have the original mail. I only saw your post at 
http://marc.theaimsgroup.com

If you find my answer useful, perhaps you can mail to the mailing list.

Best regards
Achim Abeling

> Hi all,
> 
> I've tried looking for this in the archive, but haven't had any luck, so
my
> appologies if this has already been answered.
> 
> I have a soap call which returns an object which contains an integer and a
> string array. 
> 
> When I call it the response *looks* fine[3] (via TCPMon), and the integer
> value in the returned object is correct but the string array is null.
There
> aren't any exceptions thrown (I'm using Axis 1.1 and originally thought
this
> could be http://nagoya.apache.org/bugzilla/show_bug.cgi?id=15384 "Error
> deserializing array in custom datatype" but that seems to always throw a
> SAXException, which I'm not getting).
> 
> Anybody have any ideas what might help solve this? I've included the
> WSDD[1], the client code[2] and the server response[3] below.
> 
> Thanks for your time,
> 
> Phil
> 
> [1] The server-config.wsdd:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <deployment xmlns="http://xml.apache.org/axis/wsdd/";
> xmlns:java="http://xml.apache.org/axis/wsdd/providers/java";>
>       <globalConfiguration>
>               <parameter name="sendMultiRefs" value="true"/>
>               <parameter name="sendXsiTypes" value="true"/>
>               <parameter name="sendXMLDeclaration" value="true"/>
>               <parameter name="axis.sendMinimizedElements" value="true"/>
>       </globalConfiguration>
> 
>       <handler name="LocalResponder"
> type="java:org.apache.axis.transport.local.LocalResponder"/>
> 
>       <handler name="URLMapper"
> type="java:org.apache.axis.handlers.http.URLMapper"/>
> 
>       <handler name="Authenticate"
> type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
> 
>       <service name="SomeService" provider="java:RPC">
>               <parameter name="allowedMethods" value="*"/>
>               <parameter name="className" 
>         <beanMapping qname="zooNS:MyObject" xmlns:zooNS="urn:SomeService"
> languageSpecificType="java:MyObject"/>
>       </service>
> 
>       <transport name="http">
>               <requestFlow>
>                       <handler type="URLMapper"/>
>                       <handler
> type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
>               </requestFlow>
>       </transport>
> 
>       <transport name="local">
>               <responseFlow>
>                       <handler type="LocalResponder"/>
>               </responseFlow>
>       </transport>
> 
> </deployment>
> 
> [2] The client code:
> 
> MyObject ret = new MyObject();
> 
> Service service = new Service();
> Call call = (Call) service.createCall();
> QName qn = new QName("urn:SomeService", "MyObject");
> call.registerTypeMapping(MyObject.class, qn,
>                          new
> org.apache.axis.encoding.ser.BeanSerializerFactory(MyObject.class, qn),
>                          new
> org.apache.axis.encoding.ser.BeanDeserializerFactory(MyObject.class, qn));
> 
> call.setTargetEndpointAddress(new java.net.URL(m_endPoint));
> call.setOperationName(new QName("SomeService", "getMyObject"));
> 
> call.setReturnClass(MyObject.class);
> 
> Object[] params = new Object[3];
> 
> params[0] = new Integer(intVal1);
> params[1] = new Integer(intVal2);
> params[2] = someString;
> 
> ret = (MyObject) call.invoke(params);
> 
> if (ret.getStringArray()==null) 
> {
>   // always gets into here
>   log.info("Array returned null"); 
> }
> 
> [3] The response from the server:
> 
> <?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>
>   <ns1:getMyObjectResponse
> soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
> xmlns:ns1="SomeService">
>    <ns1:getMyObject href="#id0"/>
>   </ns1:getMyObjectResponse>
>   <multiRef id="id0" soapenc:root="0"
> soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/";
> xsi:type="ns2:M" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";
> xmlns:ns2="urn:SomeService">
>    <stringArray xsi:type="soapenc:Array"
soapenc:arrayType="xsd:string[3]">
>     <item>Quiz</item>
>     <item>Badger</item>
>     <item>AnotherName</item>
>    </stringArray>
>    <returnCode xsi:type="xsd:int">32</returnCode>
>   </multiRef>
>  </soapenv:Body>
> </soapenv:Envelope>
> 
> 

-- 
Achim Abeling
Software Developer

SPLENDID Internet GmbH & Co KG
An der Halle 400 1, 24143 Kiel, Germany
Tel. +49 (0) 431 66097-0, Fax: +49 (0) 431 66097-20
Deelbogenkamp 4c, 22297 Hamburg, Germany
Tel. +49 (0) 40 325272-49, Fax +49 (0) 40 325272-50
www.splendid.de

Reply via email to