David, I've been able to successfully return an array of objects, and each of those objects has an array of other objects. Here's my approach, which Gene Chuang helped me get started with back in January:
1) In some development directory, code the service. I keep all service classes and beans underneath the same root package (i.e. package mypkg; package mypkg.beans; and the like) 2) compile, then copy the root package to the $TOMCATHOME/webapps/axis/WEB-INF/classes directory thus, you might end up with $TOMCATHOME/webapps/axis/WEB-INF/classes/ArticleSearch3 3) from that directory, run java2wsdl. for example: java org.apache.axis.wsdl.Java2WSDL -o rticleSearcher3.wsdl -l"http://localhost:8080/axis/services/ArticleSearcher 3" -n urn:ArticleSearch3 -p"ArticleSearch3" urn:ArticleSearch3 ArticleSearch3.ArticleSearcher3 See the docs for an explanation of the switches and parameters 4) copy the generated wsdl into a temp folder 5) cd to your temp folder, and run wsdl2java with the server-side switch to get the deploy and undeploy.wsdd files. Here's what I put in the command line: java org.apache.axis.wsdl.WSDL2Java --server-side ArticleSearcher3.wsdl 6) Copy the deploy and undeploy.wsdd files to your service's directory (i.e. $TOMCATHOME/webapps/axis/WEB-INF/classes/ArticleSearch3) 7) Now comes the part that was hanging me up before: editing your deploy.wsdd file. Underneath the service element is a parameter element with the "className" attribute. This will probably be something like this: <parameter name="className" value="ArticleSearch3.ArticleSearcher3SoapBindingImpl"/> Delete the "SoapBindingImpl" part, such that you end up with <parameter name="className" value="ArticleSearch3.ArticleSearcher3"/> I also delete the wsdlServicePort, wsdlServiceElement, and wsdlPortType parameters, per Gene's advice, although I haven't studied the consequences of this yet. 8) If you've followed these steps so far, the deploy.wsdd should contain the appropriate typemappings, which I've pasted to the end of this email. You should see an array de/serializer mapping for each array, and a bean de/serializer for each bean class. This is what you're missing from the deploy.wsdd file. 9) make sure you're in your service's directory (..../classes/ArticleSearch3), and run the AdminClient, like so: java org.apache.axis.client.AdminClient deploy.wsdd 10) This should update your server-config.wsdd file in the webapps/axis/WEB-INF directory with the information for your new service. 11) go to axis's localhost homepage and view your list of services. Hopefully, it'll be there. To quickly see whether your service works (assuming you're able to view the wsdl), use the .NET Web Services Studio, which is available free from Microsoft. You just point it to your wsdl file, and it'll do the rest. It should prompt you with parameters to enter, and then it'll call your service and show you the results. in this deploy.wsdd, you'll notice ArticleSearch3 and ArticleSearcher3. This is just bad code on my part. ArticleSearch3 is the package name, and ArticleSearcher3 is my service's primary class. Good luck, David. Let us know how you make out. Marc ******* my deploy.wsdd, containing correct type mappings ******** <!-- Use this file to deploy some handlers/chains and services --> <!-- Two ways to do this: --> <!-- java org.apache.axis.client.AdminClient deploy.wsdd --> <!-- after the axis server is running --> <!-- or --> <!-- java org.apache.axis.utils.Admin client|server deploy.wsdd --> <!-- from the same directory that the Axis engine runs --> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <!-- Services from ArticleSearcher3Service WSDL service --> <service name="ArticleSearcher3" provider="java:RPC" style="rpc" use="encoded"> <parameter name="wsdlTargetNamespace" value="urn:ArticleSearch3"/> <parameter name="className" value="ArticleSearch3.ArticleSearcher3"/> <operation name="main" qname="operNS:main" xmlns:operNS="urn:ArticleSearch3" > <parameter name="args" type="tns:ArrayOf_xsd_string" xmlns:tns="urn:ArticleSearch3"/> </operation> <operation name="searchByDoi" qname="operNS:searchByDoi" xmlns:operNS="urn:ArticleSearch3" returnQName="searchByDoiReturn" returnType="rtns:ArrayOfArticleBean" xmlns:rtns="urn:ArticleSearch3" > <parameter name="doi" type="tns:string" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> </operation> <operation name="searchByTitle" qname="operNS:searchByTitle" xmlns:operNS="urn:ArticleSearch3" returnQName="searchByTitleReturn" returnType="rtns:ArrayOfArticleBean" xmlns:rtns="urn:ArticleSearch3" > <parameter name="title" type="tns:string" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> </operation> <operation name="searchByKeywords" qname="operNS:searchByKeywords" xmlns:operNS="urn:ArticleSearch3" returnQName="searchByKeywordsReturn" returnType="rtns:ArrayOfArticleBean" xmlns:rtns="urn:ArticleSearch3" > <parameter name="keywords" type="tns:string" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> </operation> <operation name="searchByAuthor" qname="operNS:searchByAuthor" xmlns:operNS="urn:ArticleSearch3" returnQName="searchByAuthorReturn" returnType="rtns:ArrayOfArticleBean" xmlns:rtns="urn:ArticleSearch3" > <parameter name="author" type="tns:string" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> </operation> <operation name="ds_Close" qname="operNS:ds_Close" xmlns:operNS="urn:ArticleSearch3" > </operation> <parameter name="allowedMethods" value="main searchByDoi searchByTitle searchByKeywords searchByAuthor ds_Close"/> <typeMapping xmlns:ns="urn:ArticleSearch3" qname="ns:ArrayOf_xsd_string" type="java:java.lang.String[]" serializer="org.apache.axis.encoding.ser.ArraySerializerFactory" deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> <typeMapping xmlns:ns="urn:ArticleSearch3" qname="ns:AuthorBean" type="java:ArticleSearch3.AuthorBean" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> <typeMapping xmlns:ns="urn:ArticleSearch3" qname="ns:ArrayOfAuthorBean" type="java:ArticleSearch3.AuthorBean[]" serializer="org.apache.axis.encoding.ser.ArraySerializerFactory" deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> <typeMapping xmlns:ns="urn:ArticleSearch3" qname="ns:ArticleBean" type="java:ArticleSearch3.ArticleBean" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> <typeMapping xmlns:ns="urn:ArticleSearch3" qname="ns:ArrayOfArticleBean" type="java:ArticleSearch3.ArticleBean[]" serializer="org.apache.axis.encoding.ser.ArraySerializerFactory" deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </service> </deployment> -----Original Message----- From: David Gilbert [mailto:[EMAIL PROTECTED]] Sent: Thursday, February 06, 2003 8:58 PM To: [EMAIL PROTECTED] Subject: RE: deserializing a bean wrapped array of beans Thanks for the idea, but if add urn: to the beanMapping and use the urn: namespace on the client it still throws the same error. Has anyone else had any luck or experience with returning a bean that has an array of beans inside it? Does axis need to be told that one class holds members of another class, or should axis just deserialize bean objects as it finds them no matter what? Thanks for any ideas/help/thoughts, and especially answers. -----Original Message----- From: Olivier Gauwin [mailto:[EMAIL PROTECTED]] Sent: Wednesday, February 05, 2003 2:03 AM To: [EMAIL PROTECTED] Subject: Re: deserializing a bean wrapped array of beans Hi David, I'm not sure your namespaces are well-formed. Try to add "urn:" at the beginning of your namespaces ("urn:ProductDbHelper" instead of "ProductDbHelper", etc). HTH, Olivier David Gilbert wrote: >I have seen postings about deserializing arrays from last >January, but didn't find an answer to my problem. I am >trying to pass an object from my service back to the client >and am getting a "no deserializer defined for array type >{regisproject.util}Product" error. The object being passed >back is a bean (catalog) that contains an array of bean >objects (products). Using TCPMon I see that the message >sent to the client has the right data - > > <soapenv:Body> > <ns1:getCatalogResponse >soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" >xmlns:ns1="ProductDbHelper"> > <getCatalogReturn href="#id0"/> > </ns1:getCatalogResponse> > <multiRef id="id0" soapenc:root="0" >soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" >xsi:type="ns2:Catalog" >xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" >xmlns:ns2="regisproject.util"> > <products xsi:type="soapenc:Array" >soapenc:arrayType="ns2:Product[5]"> > <item href="#id1"/> > <item href="#id2"/> > <item href="#id3"/> > <item href="#id4"/> > <item href="#id5"/> > </products> > </multiRef> > <multiRef id="id4" soapenc:root="0" >soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" >xsi:type="ns3:Product" xmlns:ns3="regisproject.util" >xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"> > <description xsi:type="xsd:string" xsi:nil="true"/> > <id xsi:type="xsd:string">4 </id> > <inventory xsi:type="xsd:double">55.0</inventory> > <name xsi:type="xsd:string">Test Product 456</name> > <nextShipDate >xsi:type="xsd:dateTime">2003-01-01T07:00:00.000Z</nextShipDate> > <nextShipQty xsi:type="xsd:double">100.0</nextShipQty> > <price xsi:type="xsd:double">1234.56</price> > <status xsi:type="xsd:string">not active</status> > <vendorId xsi:type="xsd:string">3 </vendorId> > <vendorName >xsi:type="xsd:string">Parts-R-Us</vendorName> > </multiRef> > ... > >In my deploy.wsdd I have bean mappings for Product and >Catalog - > ><deployment xmlns="http://xml.apache.org/axis/wsdd/" > xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> > <service name="ProductDbHelper" provider="java:RPC"> > <parameter name="className" >value="regisproject.database.ProductDbHelper"/> > <parameter name="allowedMethods" >value="test,getProduct,getCatalog"/> > <beanMapping qname="myNS:Product" > xmlns:myNS="regisproject.util" >languageSpecificType="java:regisproject.util.Product"/> > <beanMapping qname="myNS:Catalog" > xmlns:myNS="regisproject.util" >languageSpecificType="java:regisproject.util.Catalog"/> > </service> ></deployment> > >Do I need to add something for the array to the .wsdd? Any >ideas as to what else is needed? > >Note: I have another service that returns a single product >and it deserializes without any problem. > >Thanks for any help you can provide. > > > >