YES! Just got it going. I had to call the service using the WSDL2Java generated classes. Previously I had been using hand coded classes, but apparently for beans within beans more elaborate mappings are required.
Thanks to you and Marc for keeping me going with new ideas and finding the mapping problem. David -----Original Message----- From: Navneet Joneja [mailto:[EMAIL PROTECTED]] Sent: Tuesday, February 11, 2003 1:50 PM To: '[EMAIL PROTECTED]' Subject: RE: deserializing a bean wrapped array of beans You could use your own beans, but then you'd either have to write a custom client-config.wsdd with your own Serializers/Deserializers for your beans or write helper classes for your beans that have the metadata, AFAIK. Yes, I know, it's a pain. - Navneet -----Original Message----- From: David Gilbert [mailto:[EMAIL PROTECTED]] Sent: Tuesday, February 11, 2003 12:47 PM To: [EMAIL PROTECTED] Subject: RE: deserializing a bean wrapped array of beans Does this mean that I have to add XML specific code to my beans for them to work with Axis deserializing? I was hoping to use hand-coded beans that I already have. I'll try the code below and let you know what I get. -----Original Message----- From: Navneet Joneja [mailto:[EMAIL PROTECTED]] Sent: Tuesday, February 11, 2003 11:44 AM To: '[EMAIL PROTECTED]' Subject: RE: deserializing a bean wrapped array of beans Here's your problem: field.setXmlType(new javax.xml.namespace.QName("http://util.regisproject", "Product")); typeDesc.addFieldDesc(field); If you look at the WSDL definition of the field, it should have been ArrayOf_tns2_Product instead of Product. If you change that, your service should work. Looks like the same bug to me :) - Navneet -----Original Message----- From: David Gilbert [mailto:[EMAIL PROTECTED]] Sent: Monday, February 10, 2003 10:14 PM To: [EMAIL PROTECTED] Subject: RE: deserializing a bean wrapped array of beans Maybe we don't have the same problem. I am assuming you used the WSDL2Java command to generate your beans. I have done the same on my code and reviewed the new beans. My parent bean (Catalog) seems to have the inner bean (Product) as an array for the getter and setter methods: public class Catalog implements java.io.Serializable { private regisproject.util.Product[] products; public Catalog() { } public regisproject.util.Product[] getProducts() { return products; } public void setProducts(regisproject.util.Product[] products) { this.products = products; } ... And the type metadata sections look like this: // Type metadata private static org.apache.axis.description.TypeDesc typeDesc = new org.apache.axis.description.TypeDesc(Catalog.class); static { org.apache.axis.description.FieldDesc field = new org.apache.axis.description.ElementDesc(); field.setFieldName("products"); field.setXmlName(new javax.xml.namespace.QName("", "products")); field.setXmlType(new javax.xml.namespace.QName("http://util.regisproject", "Product")); typeDesc.addFieldDesc(field); }; /** * Return type metadata object */ public static org.apache.axis.description.TypeDesc getTypeDesc() { return typeDesc; } Is field.setXmlType where you changed Cow to ArrayOfCow? I changed mine to look like: field.setXmlType(new javax.xml.namespace.QName("http://util.regisproject", "ArrayOfProduct")); and field.setXmlType(new javax.xml.namespace.QName("http://util.regisproject", "Product[]")); and it still doesn't work. Am I in the right place? Did your original error say anything about "No deserializer for array type..."? I am thinking we have different problems, but I would like to understand your problem and fix to see if there is any relationship that could rub off to help fix my problem. -----Original Message----- From: Navneet Joneja [mailto:[EMAIL PROTECTED]] Sent: Monday, February 10, 2003 9:36 PM To: 'David Gilbert '; '[EMAIL PROTECTED] ' Subject: RE: deserializing a bean wrapped array of beans David, I edited the metadata in the generated bean (the bean that contains the array of other beans). In the XML type metadata, it had the type mentioned as Cow (where Cow was the nested bean), rather than ArrayOfCow, so I changed it to ArrayOfCow, and all was well. Sorry I can't send the actual code as it's proprietary, but I could send you the modified axis.jar that I built and you could try generating the client stubs with it and see if it works. - Navneet. -----Original Message----- From: David Gilbert To: [EMAIL PROTECTED] Sent: 2/10/2003 7:20 PM Subject: RE: deserializing a bean wrapped array of beans It certainly could - I am using the 1.1 beta also. Can you please explain how you got your service to work in more detail? Specifically, which meta data did you change - .wsdd or code? Can you send an example? Thanks. -----Original Message----- From: Navneet Joneja [mailto:[EMAIL PROTECTED]] Sent: Monday, February 10, 2003 6:19 PM To: '[EMAIL PROTECTED]' Cc: [EMAIL PROTECTED] Subject: RE: deserializing a bean wrapped array of beans Could this be related to the bug I just described? = Navnett -----Original Message----- From: Marc Esher [mailto:[EMAIL PROTECTED]] Sent: Monday, February 10, 2003 4:46 PM To: [EMAIL PROTECTED] Cc: [EMAIL PROTECTED] Subject: RE: deserializing a bean wrapped array of beans David, Is this array coming from your client-side code that's callling the service? And can you successfully deploy the server-side code, get the service to appear in axis's list of service, and successfully view the wsdl? Marc -----Original Message----- From: David Gilbert [mailto:[EMAIL PROTECTED]] Sent: Monday, February 10, 2003 5:39 PM To: [EMAIL PROTECTED]; [EMAIL PROTECTED] Subject: RE: deserializing a bean wrapped array of beans Marc, I have done as instructed below, but still have the same problem with a new namespace. Conceptually I don't understand how Axis would know how to deserialize the Products within the Catalog without a namespace being provided for the Product object to assist in mapping to a deserializer. When I make the call to get the Catalog I specify the namespace that will be returned for the Catalog and Axis is able to map the object name and the namespace to the beanMapping or typeMapping. How would Axis know the namespace to use for looking up the deserialization mapping for Products if I don't specify it as part of the call? Both Catalog and Product currently use the same namespace, but when returning the Catalog I am still getting - org.xml.sax.SAXException: No deserializer defined for array type {http://util.regisproject}Product. Here are the new deploy.wsdd file contents: <!-- 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 ProductDbHelperService WSDL service --> <service name="ProductDbHelper" provider="java:RPC" style="rpc" use="encoded"> <parameter name="wsdlTargetNamespace" value="urn:ProductDbHelper"/> <parameter name="className" value="regisproject.database.ProductDbHelper"/> <operation name="main" qname="operNS:main" xmlns:operNS="urn:ProductDbHelper" > <parameter name="args" type="tns:ArrayOf_xsd_string" xmlns:tns="urn:ProductDbHelper"/> </operation> <operation name="test" qname="operNS:test" xmlns:operNS="urn:ProductDbHelper" returnQName="testReturn" returnType="rtns:string" xmlns:rtns="http://www.w3.org/2001/XMLSchema" > <parameter name="msg" type="tns:string" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> </operation> <operation name="getProduct" qname="operNS:getProduct" xmlns:operNS="urn:ProductDbHelper" returnQName="getProductReturn" returnType="rtns:Product" xmlns:rtns="http://util.regisproject" > <parameter name="id" type="tns:string" xmlns:tns="http://www.w3.org/2001/XMLSchema"/> </operation> <operation name="getCatalog" qname="operNS:getCatalog" xmlns:operNS="urn:ProductDbHelper" returnQName="getCatalogReturn" returnType="rtns:Catalog" xmlns:rtns="http://util.regisproject" > </operation> <operation name="getCatalog2" qname="operNS:getCatalog2" xmlns:operNS="urn:ProductDbHelper" returnQName="getCatalog2Return" returnType="rtns:Catalog2" xmlns:rtns="http://util.regisproject" > </operation> <parameter name="allowedMethods" value="main test getProduct getCatalog getCatalog2"/> <typeMapping xmlns:ns="urn:ProductDbHelper" 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="http://util.regisproject" qname="ns:Product" type="java:regisproject.util.Product" 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:ProductDbHelper" qname="ns:ArrayOf_tns2_Product" type="java:regisproject.util.Product[]" 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:ProductDbHelper" qname="ns:ArrayOf_xsd_double" type="java:double[]" serializer="org.apache.axis.encoding.ser.ArraySerializerFactory" deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> <typeMapping xmlns:ns="http://util.regisproject" qname="ns:Catalog" type="java:regisproject.util.Catalog" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> <typeMapping xmlns:ns="http://util.regisproject" qname="ns:Catalog2" type="java:regisproject.util.Catalog2" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> </service> </deployment> Here is my Catalog class: public class Catalog { private Product[] products; public Product[] getProducts() { return products; } public void setProducts(Product[] prods) { products = prods; } public Catalog(Product[] prods) { products = prods; } public Catalog() { } public static void main(String[] args) { Catalog catalog1 = new Catalog(); } } Is more needed here? -----Original Message----- From: Marc Esher [mailto:[EMAIL PROTECTED]] Sent: Friday, February 07, 2003 6:20 PM To: [EMAIL PROTECTED] Subject: RE: deserializing a bean wrapped array of beans 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. > > > >