WebServiceRef & HandlerChain annotations
egelke Oct 28, 2007 6:24 AMI think I found a bug with the way the HandlerChain annotation is implemented in JBossWS 2.0.1.SP2 on JBoss 4.2.2
It happends when I use @HandlerChain in the following condition:
1) A field in a Stateless Session Bean
2) The type of the field is the port type
3) The field is annotated with @WebServiceRef
An example of the declaration:
@HandlerChain(file = "MyWsClient_HandlerChains.xml") @WebServiceRef(name = "ws/MyWs", wsdlLocation = "META-INF/wsdl/MyWs.wsdl") private MyWsPort wsPort;
In that case I get the following errror:
Caused by: org.jboss.ws.WSException: Cannot resolve handler file 'be/egelke/MyWsClient_HandlerChains.xml' on javax.xml.ws.Service at org.jboss.ws.metadata.builder.jaxws.JAXWSMetaDataBuilder.getHandlerChainsMetaData(JAXWSMetaDataBuilder.java:235) at org.jboss.ws.core.jaxws.spi.ServiceDelegateImpl.<init>(ServiceDelegateImpl.java:150) at org.jboss.ws.core.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:61) at javax.xml.ws.Service.<init>(Service.java:83) at javax.xml.ws.Service.create(Service.java:721) at org.jboss.ws.core.jaxws.client.ServiceObjectFactoryJAXWS.getObjectInstance(ServiceObjectFactoryJAXWS.java:135) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304) at org.jnp.interfaces.NamingContext.getObjectInstance(NamingContext.java:1273) at org.jnp.interfaces.NamingContext.getObjectInstanceWrapFailure(NamingContext.java:1290) ... 143 more
I did check the code and found the following on the line specified in the above exception:
// Try the filename relative to class if (fileURL == null) { String filepath = filename; String packagePath = wsClass.getPackage().getName().replace('.', '/'); String resourcePath = packagePath + "/" + filepath; while (filepath.startsWith("../")) { packagePath = packagePath.substring(0, packagePath.lastIndexOf("/")); filepath = filepath.substring(3); resourcePath = packagePath + "/" + filepath; } fileURL = wsClass.getClassLoader().getResource(resourcePath); } if (fileURL == null) throw new WSException("Cannot resolve handler file '" + filename + "' on " + wsClass.getName());
As you can see, the above tries the load my handler file with the classloader from the javax.xml.ws.Service class. Obviously, my handler file can't be found.
Is there a way that I can make it work or is this a bug or limitation?
I did find some ways to get arround the problem, but all have there disadvantages:
1) Replace the Port class of the field by the Service Client class: requires extra code which complicates unit testing.
2) Specify the correct service implementation class: only available in JBoss 5.0