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 > 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 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 > >
