Many thanks for your reply. I am now using an ExceptionMapper for application errors and have created a ResponseHandler to try an catch other interceptor exceptions but I can't work out how to get hold of the exception from the objects passed into the handleResponse method.
I tried doing message.getExchange().getOutMessage().getContent(Exception.class)) but no luck.. Please could you advise how this is possible? Many thanks Sent from a mobile device On 12 Sep 2013, at 21:05, Sergey Beryozkin <[email protected]> wrote: > Hi > On 12/09/13 18:32, Mandy Warren wrote: >> Hi, >> >> I am trying to write a Fault Interceptor to handle exceptions both from my >> application code & from other interceptors. The Interceptor needs to change >> the HTTP status code to something appropriate and set the message body with >> info that explains the error in more detail (either in JSON or XML >> depending on the request mime type). >> >> Many of the examples I have seen modify the HttpResponse using code such as: >> >> HttpServletResponse response = (HttpServletResponse) message >> .getExchange().getInMessage() >> .get(AbstractHTTPDestination.HTTP_RESPONSE); >> >> however because we have integration tests which use the CXF local transport >> rather than HTTP this code doesn't seem to work. >> >> I need a solution which works for both HTTP & Local Transport. >> >> Here's the code I have so far but I get a null pointer thrown as the >> OutMessage seems to be null.. >> >> public class MyFaultInterceptor extends AbstractPhaseInterceptor<Message> { >>> >>> public CAPTWOFaultInterceptor() { >>> super(Phase.PRE_STREAM); >>> } >>> >>> public void handleMessage(Message message) throws Fault { >>> >>> Exception ex = message.getContent(Exception.class); >>> >>> if (ex == null) { >>> LOGGER.debug("unexpected null exception"); >>> throw new RuntimeException("Exception is expected"); >>> } >>> if (!(ex instanceof Fault)) { >>> LOGGER.debug("unexpected exception type"); >>> throw new RuntimeException("Fault is expected"); >>> } >>> >>> Fault fault = (Fault)ex; >>> Throwable causingException = fault.getCause(); >>> >>> LOGGER.debug("handling exception >>> {}"+causingException.getClass().getName()); >>> >>> if (causingException instanceof SomeBadException) { >>> Response response = >>> Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); >> // outMessage seems to be null! >> >> message.getExchange().getOutMessage().put(Response.class, >> response); >> } >> >> message.getInterceptorChain().abort(); // not sure if I need this! >> } >> >> >> >> Any help would be much appreciated! > I think the only way to make it work in a portable way across multiple > transports is to work with JAX-RS 2.0 ExceptionMapper (for catching the > exceptions) and also replace the CXF interceptors with JAX-RS 2.0 in/out > filters - this way it is guaranteed that JAX-RS Response will be produced and > thus it will work even for Local transport. > > Using CXF interceptors in JAX-RS would also work with Local transport in > normal flows but the exceptions thrown from such interceptors can only be > handled in fault interceptors, where realistically you need to work with > HttpServletResponse; > > I'm not sure why an out message is null; that solution probably won't work > anyway, though may be we should look into it too; I'm not sure actually we > have Local transport tests dealing with JAX-RS server errors, I'll have a look > > Sergey > > >> Many thanks >> >> Mandy > > > -- > Sergey Beryozkin > > Talend Community Coders > http://coders.talend.com/ > > Blog: http://sberyozkin.blogspot.com
