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