wstools generate wrong array type class !
ericmacau May 11, 2006 10:41 PMHello,
I use the JBossWS-1.0GA with JBoss4.0.4CR2.
I tested the web service with EJB3 SessionBean, after use the wstools to generate the stub interfaces, it just rasied error in those generate codes.
I tried to use C# to call the WebService (M$VS2005), the code generation is better and correct than the wstools (provided with JBossWS), but it still not work and raised the exception:
10:23:06,421 ERROR [SOAPFaultExceptionHelper] SOAP request exception javax.xml.rpc.JAXRPCException: Cannot create or send response message at org.jboss.ws.server.ServiceEndpoint.postProcessResponse(ServiceEndpoi nt.java:311) at org.jboss.ws.server.ServiceEndpoint.handleRequest(ServiceEndpoint.jav a:236) at org.jboss.ws.server.ServiceEndpointServlet.doPost(ServiceEndpointServ let.java:120) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl icationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFi lter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl icationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV alve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV alve.java:178) at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrinc ipalValve.java:54) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(Securit yAssociationValve.java:174) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValv e.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j ava:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j ava:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal ve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav a:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java :869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.p rocessConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpo int.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWor kerThread.java:112) at java.lang.Thread.run(Thread.java:595) Caused by: org.jboss.xb.binding.JBossXBValueFormatException: Java value for XSD boolean type expected to be an instance of java.lang.Boolean or java.lang.Number . But the value is of type org.hibernate.collection.PersistentBag at org.jboss.xb.binding.SimpleTypeBindings.marshal(SimpleTypeBindings.ja va:1120) at org.jboss.xb.binding.XercesXsMarshaller.marshalCharacters(XercesXsMar shaller.java:1169) at org.jboss.xb.binding.XercesXsMarshaller.marshalSimpleType(XercesXsMar shaller.java:451) at org.jboss.xb.binding.XercesXsMarshaller.marshalElementType(XercesXsMa rshaller.java:405) at org.jboss.xb.binding.XercesXsMarshaller.marshalElement(XercesXsMarsha ller.java:380) at org.jboss.xb.binding.XercesXsMarshaller.marshalElementOccurence(Xerce sXsMarshaller.java:886) at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarsh aller.java:823) at org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroupSequence(Xer cesXsMarshaller.java:1102) at org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroup(XercesXsMar shaller.java:1057) at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarsh aller.java:729) at org.jboss.xb.binding.XercesXsMarshaller.marshalComplexType(XercesXsMa rshaller.java:685) at org.jboss.xb.binding.XercesXsMarshaller.marshalElementType(XercesXsMa rshaller.java:414) at org.jboss.xb.binding.XercesXsMarshaller.marshalElement(XercesXsMarsha ller.java:380) at org.jboss.xb.binding.XercesXsMarshaller.marshalElementOccurence(Xerce sXsMarshaller.java:886) at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarsh aller.java:823) at org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroupSequence(Xer cesXsMarshaller.java:1102) at org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroup(XercesXsMar shaller.java:1057) at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarsh aller.java:729) at org.jboss.xb.binding.XercesXsMarshaller.marshalComplexType(XercesXsMa rshaller.java:685) at org.jboss.xb.binding.XercesXsMarshaller.marshalElementType(XercesXsMa rshaller.java:414) at org.jboss.xb.binding.XercesXsMarshaller.marshalElement(XercesXsMarsha ller.java:380) at org.jboss.xb.binding.XercesXsMarshaller.marshalElementOccurence(Xerce sXsMarshaller.java:886) at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarsh aller.java:810) at org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroupSequence(Xer cesXsMarshaller.java:1102) at org.jboss.xb.binding.XercesXsMarshaller.marshalModelGroup(XercesXsMar shaller.java:1057) at org.jboss.xb.binding.XercesXsMarshaller.marshalParticle(XercesXsMarsh aller.java:729) at org.jboss.xb.binding.XercesXsMarshaller.marshalComplexType(XercesXsMa rshaller.java:685) at org.jboss.xb.binding.XercesXsMarshaller.marshalElementType(XercesXsMa rshaller.java:414) at org.jboss.xb.binding.XercesXsMarshaller.marshalElement(XercesXsMarsha ller.java:380) at org.jboss.xb.binding.XercesXsMarshaller.marshalElementOccurence(Xerce sXsMarshaller.java:886) at org.jboss.xb.binding.XercesXsMarshaller.marshallInternal(XercesXsMars haller.java:275) at org.jboss.xb.binding.XercesXsMarshaller.marshal(XercesXsMarshaller.ja va:222) at org.jboss.ws.jaxb.JAXBMarshallerImpl.marshal(JAXBMarshallerImpl.java: 172) at org.jboss.ws.jaxrpc.encoding.JAXBSerializer.serialize(JAXBSerializer. java:100) at org.jboss.ws.soap.SOAPContentElement.getXMLFragment(SOAPContentElemen t.java:172) at org.jboss.ws.soap.SOAPContentElement.expandToDOM(SOAPContentElement.j ava:844) at org.jboss.ws.soap.SOAPContentElement.getChildNodes(SOAPContentElement .java:761) at org.jboss.util.xml.DOMWriter.printInternal(DOMWriter.java:201) at org.jboss.util.xml.DOMWriter.printInternal(DOMWriter.java:260) at org.jboss.util.xml.DOMWriter.printInternal(DOMWriter.java:260) at org.jboss.util.xml.DOMWriter.printInternal(DOMWriter.java:260) at org.jboss.util.xml.DOMWriter.print(DOMWriter.java:177) at org.jboss.util.xml.DOMWriter.printNode(DOMWriter.java:126) at org.jboss.ws.server.ServiceEndpoint.postProcessResponse(ServiceEndpoi nt.java:305) ... 23 more
package mo.reales.ejb.session.impl; import java.util.ArrayList; import java.util.Collection; import javax.ejb.Local; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.jws.WebMethod; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import mo.reales.ejb.model.ProductCategory; import mo.reales.ejb.session.api.ProductCategoryLocal; import mo.reales.ejb.session.api.ProductCategoryRemote; import org.jboss.annotation.ejb.LocalBinding; import org.jboss.annotation.ejb.RemoteBinding; /** * ProductCategoryBean.java * * @author Chao Hoi Ka, Eric * */ @WebService(name = "CategoryInterface", targetNamespace = "http://eric.ws/reales", serviceName = "CategoryService") @SOAPBinding(style = SOAPBinding.Style.RPC) @Stateless @Local(ProductCategoryLocal.class) @LocalBinding(jndiBinding="res_ProductCategorySessionBean/local") @Remote(ProductCategoryRemote.class) @RemoteBinding(jndiBinding="res_ProductCategorySessionBean/remote") public class ProductCategoryBean implements ProductCategoryLocal, ProductCategoryRemote { @PersistenceContext(unitName="realesDatabase") protected EntityManager em; /** * */ public ProductCategoryBean() { super(); // TODO Auto-generated constructor stub } /* (non-Javadoc) * @see mo.reales.ejb.session.ProductCategoryIF#addCategory(long, java.lang.String, java.lang.String) */ @WebMethod public void addCategory(long id, String name, String description) { ProductCategory category = new ProductCategory(); //category.setId(id); category.setName(name); category.setDescription(description); category = em.merge(category); em.persist(category); } /* (non-Javadoc) * @see mo.reales.ejb.session.ProductCategoryIF#deleteCategory(long) */ @WebMethod public void deleteCategory(long id) { ProductCategory category = findById(id); deleteCategory(category); } /* (non-Javadoc) * @see mo.reales.ejb.session.ProductCategoryIF#deleteCategory(mo.reales.ejb.model.ProductCategory) */ public void deleteCategory(ProductCategory category) { if (category != null) { em.remove(category); } } /* (non-Javadoc) * @see mo.reales.ejb.session.ProductCategoryIF#updateCategory(long, java.lang.String, java.lang.String) */ @WebMethod public void updateCategory(long id, String name, String description) { ProductCategory category = findById(id); category.setName(name); category.setDescription(description); updateCategory(category); } /* (non-Javadoc) * @see mo.reales.ejb.session.ProductCategoryIF#updateCategory(mo.reales.ejb.model.ProductCategory) */ public void updateCategory(ProductCategory category) { em.persist(category); } /* (non-Javadoc) * @see mo.reales.ejb.session.ProductCategoryIF#findByName(java.lang.String) */ @WebMethod public ProductCategory findByName(String name) { Query query = em.createNamedQuery("productCategory.findByName"); query.setParameter("name", name); Object obj = query.getSingleResult(); if (obj == null) { return null; } else { return (ProductCategory)obj; } } /* (non-Javadoc) * @see mo.reales.ejb.session.ProductCategoryIF#findById(long) */ @WebMethod public ProductCategory findById(long id) { Object obj = em.find(ProductCategory.class, id); if (obj != null) { return (ProductCategory)obj; } else { return null; } } /* (non-Javadoc) * @see mo.reales.ejb.session.ProductCategoryIF#getCategories() */ public Collection<ProductCategory> getCategories() { //return em.createQuery("from ProductCategory p").getResultList(); return em.createNamedQuery("productCategory.findAll").getResultList(); } @WebMethod public ProductCategory[] getCategoriesArray() { ArrayList categories = new ArrayList(); categories.addAll(getCategories()); if (categories.size() > 0) { ProductCategory[] cats = new ProductCategory[categories.size()]; cats = (ProductCategory[])categories.toArray(cats); return cats; } else { return null; } } }
Error with this generated class: The public type ProductCategory must be defined in its own file
/* * JBossWS WS-Tools Generated Source * * Generation Date: Fri May 12 10:32:09 GMT+08:00 2006 * * This generated source code represents a derivative work of the input to * the generator that produced it. Consult the input for the copyright and * terms of use that apply to this source code. */ package eric.ws.reales; public class ProductCategory.Array { protected eric.ws.reales.ProductCategory[] value; public ProductCategory.Array(){} public ProductCategory.Array(eric.ws.reales.ProductCategory[] value){ this.value=value; } public eric.ws.reales.ProductCategory[] getValue() { return value ;} public void setValue(eric.ws.reales.ProductCategory[] value){ this.value=value; } }
<definitions name='CategoryService' targetNamespace='http://eric.ws/reales' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:ns1='http://util.java/jaws' xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' xmlns:tns='http://eric.ws/reales' xmlns:xsd='http://www.w3.org/2001/XMLSchema'> <types> <schema elementFormDefault='qualified' targetNamespace='http://eric.ws/reales' xmlns='http://www.w3.org/2001/XMLSchema' xmlns:ns2='http://util.java/jaws' xmlns:soap11-enc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns='http://eric.ws/reales' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> <import namespace='http://util.java/jaws'/> <complexType name='ProductCategory'> <sequence> <element name='description' nillable='true' type='string'/> <element name='id' type='long'/> <element name='name' nillable='true' type='string'/> <element name='products' nillable='true' type='ns2:Collection'/> </sequence> </complexType> <complexType name='ProductCategory.Array'> <sequence> <element maxOccurs='unbounded' minOccurs='0' name='value' nillable='true' type='tns:ProductCategory'/> </sequence> </complexType> </schema> <schema elementFormDefault='qualified' targetNamespace='http://util.java/jaws' xmlns='http://www.w3.org/2001/XMLSchema' xmlns:ns1='http://eric.ws/reales' xmlns:soap11-enc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns='http://util.java/jaws' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'> <import namespace='http://eric.ws/reales'/> <complexType name='Collection'> <sequence> <element name='empty' type='boolean'/> </sequence> </complexType> </schema> </types> <message name='CategoryInterface_addCategoryResponse'></message> <message name='CategoryInterface_getCategoriesArray'></message> <message name='CategoryInterface_findByNameResponse'> <part name='result' type='tns:ProductCategory'/> </message> <message name='CategoryInterface_findById'> <part name='long_1' type='xsd:long'/> </message> <message name='CategoryInterface_addCategory'> <part name='long_1' type='xsd:long'/> <part name='String_1' type='xsd:string'/> <part name='String_2' type='xsd:string'/> </message> <message name='CategoryInterface_updateCategoryResponse'></message> <message name='CategoryInterface_deleteCategory'> <part name='long_1' type='xsd:long'/> </message> <message name='CategoryInterface_updateCategory'> <part name='long_1' type='xsd:long'/> <part name='String_1' type='xsd:string'/> <part name='String_2' type='xsd:string'/> </message> <message name='CategoryInterface_deleteCategoryResponse'></message> <message name='CategoryInterface_getCategoriesArrayResponse'> <part name='result' type='tns:ProductCategory.Array'/> </message> <message name='CategoryInterface_findByName'> <part name='String_1' type='xsd:string'/> </message> <message name='CategoryInterface_findByIdResponse'> <part name='result' type='tns:ProductCategory'/> </message> <portType name='CategoryInterface'> <operation name='addCategory' parameterOrder='long_1 String_1 String_2'> <input message='tns:CategoryInterface_addCategory'/> <output message='tns:CategoryInterface_addCategoryResponse'/> </operation> <operation name='deleteCategory' parameterOrder='long_1'> <input message='tns:CategoryInterface_deleteCategory'/> <output message='tns:CategoryInterface_deleteCategoryResponse'/> </operation> <operation name='findById' parameterOrder='long_1'> <input message='tns:CategoryInterface_findById'/> <output message='tns:CategoryInterface_findByIdResponse'/> </operation> <operation name='findByName' parameterOrder='String_1'> <input message='tns:CategoryInterface_findByName'/> <output message='tns:CategoryInterface_findByNameResponse'/> </operation> <operation name='getCategoriesArray'> <input message='tns:CategoryInterface_getCategoriesArray'/> <output message='tns:CategoryInterface_getCategoriesArrayResponse'/> </operation> <operation name='updateCategory' parameterOrder='long_1 String_1 String_2'> <input message='tns:CategoryInterface_updateCategory'/> <output message='tns:CategoryInterface_updateCategoryResponse'/> </operation> </portType> <binding name='CategoryInterfaceBinding' type='tns:CategoryInterface'> <soap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/> <operation name='addCategory'> <soap:operation soapAction=''/> <input> <soap:body namespace='http://eric.ws/reales' use='literal'/> </input> <output> <soap:body namespace='http://eric.ws/reales' use='literal'/> </output> </operation> <operation name='deleteCategory'> <soap:operation soapAction=''/> <input> <soap:body namespace='http://eric.ws/reales' use='literal'/> </input> <output> <soap:body namespace='http://eric.ws/reales' use='literal'/> </output> </operation> <operation name='findById'> <soap:operation soapAction=''/> <input> <soap:body namespace='http://eric.ws/reales' use='literal'/> </input> <output> <soap:body namespace='http://eric.ws/reales' use='literal'/> </output> </operation> <operation name='findByName'> <soap:operation soapAction=''/> <input> <soap:body namespace='http://eric.ws/reales' use='literal'/> </input> <output> <soap:body namespace='http://eric.ws/reales' use='literal'/> </output> </operation> <operation name='getCategoriesArray'> <soap:operation soapAction=''/> <input> <soap:body namespace='http://eric.ws/reales' use='literal'/> </input> <output> <soap:body namespace='http://eric.ws/reales' use='literal'/> </output> </operation> <operation name='updateCategory'> <soap:operation soapAction=''/> <input> <soap:body namespace='http://eric.ws/reales' use='literal'/> </input> <output> <soap:body namespace='http://eric.ws/reales' use='literal'/> </output> </operation> </binding> <service name='CategoryService'> <port binding='tns:CategoryInterfaceBinding' name='CategoryInterfacePort'> <soap:address location='http://DINF25HKC:80/reales-ejb/ProductCategoryBean'/> </port> </service> </definitions>