Hi Axis users, I was wondering if someone might know the solution to a deserialization problem that I'm experiencing when returning a Java String array type in a response from a service method.
My service is deployed to Axis 1.1 and it's invoked using client stubs generated with Axis WSDL2Java. I'm able to pass string arrays in requests, but when I return a string array I encounter this exception: org.xml.sax.SAXException: Bad types (class [Ljava.lang.Object; -> class java.lang.String) at org.apache.axis.message.RPCHandler.onStartChild (RPCHandler.java:311) at org.apache.axis.encoding.DeserializationContextImpl.startElement (DeserializationContextImpl.java:963) For example, here's a test class that I've deployed to Axis: package arraytest; public class Test { public String[] method() { return new String [] {"a", "b", "c"}; } } My wsdd file is defined as: <?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"> <service name="TestService" provider="java:RPC"> <parameter name="allowedMethods" value="method"/> <parameter name="scope" value="request"/> <parameter name="className" value="arraytest.Test"/> <typeMapping encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" serializer="org.apache.axis.encoding.ser.ArraySerializerFactory" deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory" type="java:java.lang.String[]" qname="ns1:ArrayOfString" xmlns:ns1="urn:java.lang"/> </service> </deployment> Is there a problem with the type mapping that I've created? My client is using stub classes generated with Axis WSDL2Java. The code which makes the call was generated as: public java.lang.String[] method() throws java.rmi.RemoteException { if (super.cachedEndpoint== null) { throw new org.apache.axis.NoEndPointException(); } org.apache.axis.client.Call _call = createCall(); _call.setOperation(_operations[0]); _call.setUseSOAPAction(true); _call.setSOAPActionURI(""); _call.setSOAPVersion (org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); _call.setOperationName(new javax.xml.namespace.QName ("http://arraytest", "method")); setRequestHeaders(_call); setAttachments(_call); java.lang.Object _resp = _call.invoke(new java.lang.Object[] {}); if (_resp instanceof java.rmi.RemoteException) { throw (java.rmi.RemoteException)_resp; } else { extractAttachments(_call); try { return (java.lang.String[]) _resp; } catch (java.lang.Exception _exception) { return (java.lang.String[]) org.apache.axis.utils.JavaUtils.convert( _resp, java.lang.String.class); } } } Here's my wsdl document: <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://localhost:18080/axis/services/TestService" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:18080/axis/services/TestService" xmlns:intf="http://localhost:18080/axis/services/TestService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="urn:java.lang" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <schema targetNamespace="urn:java.lang" xmlns="http://www.w3.org/2001/XMLSchema"> <import namespace="http://schemas.xmlsoap.org/soap/encoding/" /> <complexType name="ArrayOfString"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]" /> </restriction> </complexContent> </complexType> </schema> </wsdl:types> <wsdl:message name="methodResponse"> <wsdl:part name="methodReturn" type="tns1:ArrayOfString" /> </wsdl:message> <wsdl:message name="methodRequest"> </wsdl:message> <wsdl:portType name="Test"> <wsdl:operation name="method"> <wsdl:input message="impl:methodRequest" name="methodRequest" /> <wsdl:output message="impl:methodResponse" name="methodResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="TestServiceSoapBinding" type="impl:Test"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="method"> <wsdlsoap:operation soapAction="" /> <wsdl:input name="methodRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://arraytest" use="encoded" /> </wsdl:input> <wsdl:output name="methodResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:18080/axis/services/TestService" use="encoded" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="TestService"> <wsdl:port binding="impl:TestServiceSoapBinding" name="TestService"> <wsdlsoap:address location="http://localhost:18080/axis/services/TestService" /> </wsdl:port> </wsdl:service> </wsdl:definitions> Thanks in advance! Ray __________________________________ Do you Yahoo!? Yahoo! Search - Find what you’re looking for faster http://search.yahoo.com