I'm creating a Jersey web service, and I've found myself using both of the mentioned exception types. WebServiceException's constructor allows you to pass a String as the cause where WebApplicationException allows a HTTP status code to be passed in. Including constructor differences, what's the purpose of having these two exception types?
Thanks.
Thrown exceptions are handled by the JAX-RS runtime if you have registered an exception mapper. Exception mappers can convert an exception to an HTTP response. If the thrown exception is not handled by a mapper, it is propagated and handled by the container (i.e., servlet) JAX-RS is running within.
public class WebApplicationException extends RuntimeException. Runtime exception for applications. This exception may be thrown by a resource method, provider or StreamingOutput implementation if a specific HTTP error response needs to be produced. Only effective if thrown prior to the response being committed.
ExceptionMapper is a contract for a provider that maps Java exceptions to Response object. An implementation of ExceptionMapper interface must be annotated with @Provider to work correctly.
A WebApplicationException is a way in which you may stop execution of a REST resource and send some meaningful information to your client. For the stuff I have been doing I subclassed this exception so that it has an implementation that produces JSON as error messages to the client. In the event of an error condition, let us say a missing file I might do something like this:
}catch(FileNotFoundException ex){
throw new MyException(ex.getMessage());
On the client this then would produce something like:
{ errorCode: 56, errorMessage: 'could not find file "input.txt"' };
http://download.oracle.com/javaee/6/api/javax/ws/rs/WebApplicationException.html'
A WebServiceException is the root run time exception for Jersey, i.e. its what most commonly results from your resources crashing and results in a HTTP 500.
http://download.oracle.com/javaee/5/api/javax/xml/ws/WebServiceException.html
So the short answer is the first exception is one you might throw and the other is one you hope is never thrown. :P
An example:
public class MyException extends WebApplicationException {
public MyException(JSONObject jsonObject) {
super(Response.status(Response.Status.OK)
.entity(jsonObject)
.type(MediaType.APPLICATION_JSON)
.build());
}
Then from anywhere in your code you want to halt execution and send the error information to the client do this:
}catch(FileNotFoundException ex){
throw new MyException(new JSONObject(){{ this.put("errorCode", 4); .... }});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With