Hi Sergey,

I finally got round to testing this tonight for handling both In & Out 
Interceptor faults & it works perfectly as described using 2.7.8-SNAPSHOT. This 
makes life so much easier! Do you have any rough timescale as to when 2.7.8 
will be released?

Many thanks

Mandy

On 1 Oct 2013, at 13:23, Sergey Beryozkin wrote:

> I've actually merged it to CXF 2.7.x, but made the in fault mapping optional 
> so as not to affect the existing in fault interceptors if any:
> 
> https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+Basics#JAX-RSBasics-MappingexceptionsthrownfromCXFinterceptors
> 
> Cheers, Sergey
> On 28/09/13 21:28, Mandy Warren wrote:
>> This is great news Sergey, thanks so much for following this up! Please let 
>> me know when this is ready to use!
>> 
>> Mandy
>> 
>> Sent from a mobile device
>> 
>> On 25 Sep 2013, at 21:28, Sergey Beryozkin <sberyoz...@gmail.com> wrote:
>> 
>>> Hi Mandy,
>>> 
>>> FYI, after talking to you I thought I'd go ahead and finally resolve the 
>>> long time pending issue of mapping the exceptions thrown from non-JAX-RS 
>>> CXF interceptors to JAX-RS responses. I think it is mostly done now, after 
>>> chatting to Dan and poking a bit it seems to be working OK, but on the 
>>> trunk only, I may need to tweak it a bit more before documenting.
>>> So if the exceptions can be mapped by ExceptionMappers then they won't make 
>>> it to the fault chain where the mapping would have to be done manually - 
>>> I'm keeping this change on the trunk as there could be the existing fault 
>>> interceptors deployed but the good news is that it will become simpler to 
>>> manage the exceptions thrown from the existing CXF interceptors on JAX-RS 
>>> runtime paths...
>>> 
>>> Thanks, Sergey
>>> On 19/09/13 21:31, Mandy Warren wrote:
>>>> Many thanks this worked fine!
>>>> 
>>>> Sent from a mobile device
>>>> 
>>>> On 13 Sep 2013, at 17:31, Sergey Beryozkin <sberyoz...@gmail.com> wrote:
>>>> 
>>>>> Hi
>>>>> On 13/09/13 12:35, Mandy Warren wrote:
>>>>>> 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?
>>>>> The problem is that the exceptions thrown from the CXF interceptors 
>>>>> escape the JAX-RS flow, ResponseHandler (or ContainerResponseFilter in 
>>>>> CXF 3.0.0 SNAPSHOT) are part of the normal out JAX-RS chain and they do 
>>>>> not see those exceptions.
>>>>> 
>>>>> I'm presuming you throw the exceptions from CXF in interceptors, right ?
>>>>> Try replacing them with RequestHandler (or ContainerRequestFilter if on 
>>>>> CXF 2.7.x)
>>>>> 
>>>>> I need to check if, optionally, we can handle the exceptions coming from 
>>>>> other CXF in interceptors via JAX-RS and effectively ignore or fault out 
>>>>> chain...
>>>>> 
>>>>> Cheers, Sergey
>>>>> 
>>>>>> Many thanks
>>>>>> 
>>>>>> Sent from a mobile device
>>>>>> 
>>>>>> On 12 Sep 2013, at 21:05, Sergey Beryozkin <sberyoz...@gmail.com> 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
>>>>> 
>>>>> 
>>>>> --
>>>>> Sergey Beryozkin
>>>>> 
>>>>> Talend Community Coders
>>>>> http://coders.talend.com/
>>>>> 
>>>>> Blog: http://sberyozkin.blogspot.com
>>> 
>>> 
> 
> 
> -- 
> Sergey Beryozkin
> 
> Talend Community Coders
> http://coders.talend.com/
> 
> Blog: http://sberyozkin.blogspot.com

Reply via email to