Hi

Regards,
Vinay Chandrasekharan

On Apr 15, 2011, at 3:18 AM, Sergey Beryozkin <[email protected]> wrote:

Hi

On Thu, Apr 14, 2011 at 10:55 PM, Vinay Chandrasekharan
<[email protected]>wrote:

> I used the second approach you had suggested.  I tried setting the content
> type too explictly but in vain.
>

So are you saying that it works if Accept is application/json but does not
if accept is text/xml ? That is a bit strange.
It's difficult to advise without seeing a testcase

Yes that is exactly what is happening , therefore strange

Btw , How do i use the request filter to solve?
>
> If you the filter then all that conversion of exceptions will be done for
you by the runtime, provided you have exception mappers available

Let me go thru filter approach

Cheers, Sergey


> Regards,
> Vinay Chandrasekharan
>
> On Apr 14, 2011, at 4:22 PM, Sergey Beryozkin <[email protected]>
> wrote:
>
> it does not look like you set the content type there, by the way can you
> use RequestHandler filter instead ?
>
> Cheers, Sergey
>
> On Thu, Apr 14, 2011 at 5:06 PM, Vinay Chandrasekharan < <http://vinay.cn>
> vinay.cn@ <http://gmail.com>gmail.com> wrote:
>
>> Thanks Sergey.
>> It worked like a charm for application/json content-types but its
>> return 304 with no payload (obviously) for text/xml content types.
>> Can you throw light as to what might be going on here?
>> Here is the snippet based on what you had suggested.
>>
>>
>> =========
>> /**
>>  * REST fault out interceptor that can send exceptions raised by the
>>  * interceptor, if any, according to the Accept header set by the
>> client(s)
>>  *
>>  * @author vinay
>>  *
>>  */
>> public class RestFaultOutInterceptor extends JAXRSOutInterceptor {
>>        private static final Logger LOG = LoggerFactory
>>                        .getLogger(RestFaultOutInterceptor.class);
>>
>>        public RestFaultOutInterceptor() {
>>                getBefore().add(LoggingOutInterceptor.class.getName());
>>        }
>>
>>        public void handleMessage(Message message) {
>>                Exception ex = message.getContent(Exception.class);
>>                LOG.info("Got exception " + ex);
>>                if (ex == null) {
>>                        throw new RuntimeException("Exception is
>> expected");
>>                }
>>                if (!(ex instanceof Fault)) {
>>                        throw new RuntimeException("Fault is expected");
>>                }
>>                Exception cause = (Exception) ex.getCause();
>>                Response response =
>> JAXRSUtils.convertFaultToResponse(cause, message
>>                                .getExchange().getInMessage());
>>                message.setContent(List.class, new
>> MessageContentsList(response));
>>                super.handleMessage(message);
>>                message.getInterceptorChain().abort();
>>        }
>> }
>> ===============
>>
>> Regards,
>> Vinay
>>
>> On Wed, Apr 13, 2011 at 10:58 AM, Sergey Beryozkin <<[email protected]>
>> [email protected]> wrote:
>> > Hi
>> >
>> > On Wed, Apr 13, 2011 at 3:20 PM, vinayc < 
>> > <http://vinay.cn>vinay.cn@<http://gmail.com>
>> gmail.com> wrote:
>> >>
>> >> Hi,
>> >>  I am using CXF 2.3.3, and I have a custom cxf "in" interceptor
>> attached
>> >> to
>> >> a REST service.
>> >> When this interceptor throws an exception, xmlfaultoutinterceptor is
>> >> called.
>> >>
>> > Yes, that will happen if the exception is thrown from a CXF interceptor,
>> > outside of the JAX-RS scope...
>> >
>> >>
>> >> Is there an existing cxf fault out interceptor that can format the
>> message
>> >> based on  the "Accept:" header set by the client since right now even
>> if
>> >> the
>> >> caller is setting "application/json" type, it still returns an
>> "text/xml"
>> >> content back (since its XmlFaultOutIntereceptor that sends the fault
>> >> back)?
>> >>
>> >
>> > Can you try the following:
>> > - add a custom out fault interceptor which will delegate internally to
>> an
>> > instance of JAXRSOutInterceptor.handleMessage() and abort the current
>> out
>> > fault chain afterwards ? Before delegating, it should probably do the
>> > following:
>> >
>> > 1. Get the Exception from the message:
>> > Exception ex = ((Fault)message.getContent(Exception.class)).getCause();
>> >
>> > 2. Next you need to wrap it in JAX-RS Response
>> >
>> > You can do it manually:
>> >
>> > Response r =
>> >
>> Response.status(status).type("application/json").entity(exceptionObject).build();
>> >
>> >
>> > or if you have ExceptionMappers then you can use this call:
>> >
>> > Response r = JAXRSUtils.convertFaultToResponse(ex,
>> > message.getExchange().getInMessage());
>> >
>> > 3. Set Response on the message:
>> >
>> > message.setContent(List.class, new MessageContentList(r));
>> >
>> > 4. new JAXRSOutInterceptor.handleMessage(message);
>> > 5. message.getInterceptorChain().abort();
>> >
>> > that may work
>> > Cheers, Sergey
>> >
>> >>
>> >> Thanks
>> >>
>> >> Regards,
>> >> Vinay
>> >>
>> >> --
>> >> View this message in context:
>> >>
>> <http://cxf.547215.n5.nabble.com/Handling-exceptions-thrown-by-interceptors-for-rest-calls-tp4300713p4300713.html>
>> http://cxf.547215.n5.nabble.com/Handling-exceptions-thrown-by-interceptors-for-rest-calls-tp4300713p4300713.html
>> >> Sent from the cxf-user mailing list archive at Nabble.com.
>> >
>> >
>>
>>
>>
>> --
>> Warm regards,
>> Vinay Chandrasekharan
>>
>
>
>
> --
> Sergey Beryozkin
>
> Application Integration Division of Talend <http://www.talend.com>
> <http://sberyozkin.blogspot.com>http://sberyozkin.blogspot.com
>
>

Reply via email to