4.0.4.CR2 Namespace issue with Session EJB-based WS
brownjamese Apr 19, 2006 8:08 AMI have encountered an issue regarding namespaces with a web service based on a stateless sesssion bean. First, my environment:
* JBoss 4.0.4 CR2
* JBuilder 2006
* Windows XP
* JDK 1.5 update 6
The issue is that it appears that all classes must reside in the same package/namespace; otherwise, exceptions such as the following occur:
javax.xml.rpc.JAXRPCException: org.jboss.ws.binding.BindingException: javax.xml.bind.JAXBException: Failed to parse source: Failed to resolve class name for request: No ClassLoaders found for: sample.Request
The problem is that Request resides in sample.data not sample as you can see from the following directory structure listing:
+---src | +---sample | | | SampleBean.java | | | SampleLocal.java | | | SampleLocalHome.java | | | SampleWebService.java | | | | | \---data | | BusinessRequest.java | | BusinessResponse.java | | PaymentRequest.java | | PaymentResponse.java | | Request.java | | Response.java
If collapsed to a single package/namespace, no errors are encountered.
The classes in sample.data nothing more than shells - for example:
package sample.data; public class BusinessRequest { private String policyNumber; public BusinessRequest() { policyNumber = null; } public BusinessRequest(String policyNumber) { this.policyNumber = policyNumber; } public String getPolicyNumber() { return policyNumber; } public void setPolicyNumber(String policyNumber) { this.policyNumber = policyNumber; } }
The EJB is even simpler:
package sample; import javax.ejb.SessionBean; import javax.ejb.SessionContext; import javax.ejb.CreateException; import sample.data.Response; import sample.data.Request; public class SampleBean implements SessionBean { SessionContext sessionContext; public void ejbCreate() throws CreateException { } public void ejbRemove() { } public void ejbActivate() { } public void ejbPassivate() { } public void setSessionContext(SessionContext sessionContext) { this.sessionContext = sessionContext; } public Response test(Request request) { // do nothing return new Response(); } }
And the WSDL looks correct as well:
<wsdl:definitions targetNamespace='http://sample' xmlns:apachesoap='http://xml.apache.org/xml-soap' xmlns:impl='http://sample' xmlns:intf='http://sample' xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/' xmlns:tns2='http://data.sample' 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='http://data.sample' xmlns='http://www.w3.org/2001/XMLSchema'> <import namespace='http://schemas.xmlsoap.org/soap/encoding/'/> <complexType name='BusinessRequest'> <sequence> <element name='policyNumber' nillable='true' type='xsd:string'/> </sequence> </complexType> <complexType name='PaymentRequest'> <sequence> <element name='account' nillable='true' type='xsd:string'/> </sequence> </complexType> <complexType name='Request'> <sequence> <element name='businessRequest' nillable='true' type='tns2:BusinessRequest'/> <element name='paymentRequest' nillable='true' type='tns2:PaymentRequest'/> </sequence> </complexType> <complexType name='BusinessResponse'> <sequence/> </complexType> <complexType name='PaymentResponse'> <sequence> <element name='transactionID' nillable='true' type='xsd:string'/> </sequence> </complexType> <complexType name='Response'> <sequence> <element name='businessResponse' nillable='true' type='tns2:BusinessResponse'/> <element name='paymentResponse' nillable='true' type='tns2:PaymentResponse'/> </sequence> </complexType> </schema> </wsdl:types> <wsdl:message name='testRequest'> <wsdl:part name='request' type='tns2:Request'/> </wsdl:message> <wsdl:message name='testResponse'> <wsdl:part name='testReturn' type='tns2:Response'/> </wsdl:message> <wsdl:portType name='SampleLocal'> <wsdl:operation name='test' parameterOrder='request'> <wsdl:input message='impl:testRequest' name='testRequest'/> <wsdl:output message='impl:testResponse' name='testResponse'/> </wsdl:operation> </wsdl:portType> <wsdl:binding name='SampleLocalSoapBinding' type='impl:SampleLocal'> <wsdlsoap:binding style='rpc' transport='http://schemas.xmlsoap.org/soap/http'/> <wsdl:operation name='test'> <wsdlsoap:operation soapAction=''/> <wsdl:input name='testRequest'> <wsdlsoap:body encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='http://sample' use='encoded'/> </wsdl:input> <wsdl:output name='testResponse'> <wsdlsoap:body encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' namespace='http://sample' use='encoded'/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name='SampleLocalService'> <wsdl:port binding='impl:SampleLocalSoapBinding' name='SamplePort'> <wsdlsoap:address location='http://CAHAL-BROWNJ61:8080/SampleEJB/Enterprise1Service'/> </wsdl:port> </wsdl:service> </wsdl:definitions>
What is causing this issue? I can rectify by collapsing all classes to once package/namespace; however, that seems like an architectural cop-out.
-- James