users@jersey.java.net

Re: [Jersey] ExceptionMapper and Viewable

From: Paul Sandoz <Paul.Sandoz_at_Sun.COM>
Date: Thu, 01 Oct 2009 10:33:48 +0200

On Sep 30, 2009, at 1:44 PM, Jordi Domingo wrote:

>
> Hi :)
>
> I'm trying to make an ExceptionMapper that returns the response
> expected by the client. I dont know how i can return a Viewable or a
> JSON response because i dont have access to any object with that
> information
>
> public Response toResponse(EJBException exception) {}
>

If a resource method was selected for invocation then the Content-Type
of the response will have been selected if the @Produces specifies a
concrete (non-wild card) media type. So if the Content-Type is present
you can look at that.

You can inject Jersey's HttpContext on the ExceptionMapper and in the
toResponse method you can do:

   MediaType m = httpContext.getResponse().getMediaType();

You can also get access to the acceptable headers by doing:

   httpContext.getRequest().getAcceptableMediaTypes()

(That method is a method on javax.ws.rs.core.HttpHeaders, which can be
injected if required rather than referring to something Jersey
specific).


> On another side, when Jersey finds an Exception (not Runtime) that
> is not mapped, forwards it to the ServletContainer, thats fine.

Any RuntimeException that is not mapped will be re-thrown and it will
pass through Jersey's Servlet layer to the Servlet framework from
where it can be mapped using Servlet-based rules.

Any checked exception that is not mapped will be wrapped around a
Jersey runtime exception (ContainerException) and that will be passed
to Jersey's Servlet layer and wrapped in a ServletException exception
and re-thrown.


> When i do the same with an EJBException (SystemException) I dont
> know how to achieve the same behavior. This is my code for testing:
>
> public Response toResponse(EJBException exception) {
> final Exception cause = exception.getCausedByException();
>
> return new WebApplicationException(cause).getResponse();
> }
>

I am not sure i understand what you want to achieve.

Do you want the EJBException to be passed through to the Servlet
framework?

Paul.