I am currently working on an old legacy system that is using jax-rpc. I would like to add in some custom faults such that I can inform clients better. I.E. I can throw custom exceptions/faults such that the user can catch them to determine the best course of action. However using JBoss I have not been able to get this to work. The main problem is that in the SOAP message that comes back there is no <detail> tag. This tag is how the exception would get deserialized on the client, so without that tag the client will have no idea what exception/fault was thrown.
Has anyone every gotten a custom fault to work with JBoss? My guess is no as I have not been able to find out anything on this problem.
I am running 4.2.3.GA and out of the box is has jbossws-native-3.0.1, I also installed jbossws-native-3.1.1.GA to see if it fixed the problem but I was still out of luck. Please help I am all out of ideas! Below are some code snippets to show what I am talking about. If you need more please let me know.
I took a simple example jax-rpc HelloWord service from the java tutorial section and added a fault to the wsdl.
Here is a snippet:
<portType name="HelloIF">
<operation name="sayHello" parameterOrder="String_1">
<input message="tns:HelloIF_sayHello"/>
<output message="tns:HelloIF_sayHelloResponse"/>
<fault name="fault" message="tns:sayHelloException"></fault>
</operation>
</portType>
I generated the jax-rpc classes:
Here is the fault/exception generated:
public class SayHelloException extends java.lang.Exception {
private java.lang.String message;
public SayHelloException(java.lang.String message) {
super(message);
this.message = message;
}
public java.lang.String getMessage() {
return message;
}
}
Here is the endpoint interface:
public interface HelloIF extends java.rmi.Remote {
public java.lang.String sayHello(boolean string_1) throws
samples.webservices.jaxrpc.simple.SayHelloException, java.rmi.RemoteException;
}
I also creating the jax-rpc mapping file and deployed with the war in the web-inf directory as well as my webservices.xml and web.xml.
At this point I am not sure why jboss is not creating the <detail> tag in the SOAP message that gets sent back to the server.
Here is how I throw the custom exception on the server:
throw new SayHelloException("Throwing custom exception/fault from WS");
Here is my client:
try {
Stub stub = (Stub) port;
stub._setProperty(javax.xml.rpc.Stub.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/hello/simple");
String result = port.sayHello(true);
System.out.println(result);
} catch (SayHelloException ex) {
System.out.println("PASS! caught a custom exception");
} catch (RemoteException ex) {
} catch (Exception ex) {
System.out.println("FAIL! caught a Exception");
}
Windows 7: It works the way you want. Learn more.