In cxf jaxrs implementation, javax.ws.rs.ex.ExceptionMapper can work because JAXRSInInterceptor.handleFault(...) will invokde it. But JAXRSOutInterceptor.handleFault(...) does not do as much as JASRSInInterceptor does. That is ExceptionMapper only works during IN interceptor chain. My exception happens during OUT interceptor chain, That is, I need to to use serlvlet api to consturct my response.
Rice On Mon, May 16, 2016 at 11:16 AM, Rice Yeh <[email protected]> wrote: > Hi, > I do release my resources in a interceptor. Just when error happens when > releasing resources in my intereceptor, I like to construct my response. > But since the intereceptor is after jaxrs, I cannot access jaxrs api but > servlet api. So I construct my response with HttpServletResponse directly. > How do I construct my response in a more cxf-friendly way? > I try to use message.setContent(Response.class, ...) but it does not work. > > On Sun, May 15, 2016 at 10:13 PM, Andrei Shakirin <[email protected]> > wrote: > >> Hi Rice, >> >> The error said that you try to use Jetty Response in Writer mode >> (getWriter()), although it was originally opened in stream mode >> (getOutputStream()). >> Generally I am not sure that setting headers and content directly in >> Response is a good idea - this makes your code fragile and dependent on >> internal CXF implementation. >> >> Why don't release your resources in JX-RS Filter ( >> http://cxf.apache.org/docs/jax-rs-filters.html) or Interceptor ( >> http://cxf.apache.org/docs/jax-rs-basics.html#JAX-RSBasics-Interceptors)? >> >> Regards, >> Andrei. >> >> > -----Original Message----- >> > From: Rice Yeh [mailto:[email protected]] >> > Sent: Samstag, 14. Mai 2016 09:48 >> > To: [email protected] >> > Subject: Error handling in out interceptor in jaxrs >> > >> > Hi, >> > I write a outward interceptor and put it after JAXRSOutInterceptor to >> clean >> > up some resouces. When cleaning up the resources, there might be some >> > exceptions happening. Then I directly set the HttpServletResponse's >> headers >> > and content to send back an appropriate response. This works even there >> is >> > a IllegalStateException thrown when later cxf's jaxrs implementation >> try flush >> > http headers to the HttpServletResponse like below. Any more appropriate >> > way to achieve my goal without this exception? >> > >> > 2016-05-13T16:58:36.514 [qtp1980982961-89] WARN >> > o.a.cxf.phase.PhaseInterceptorChain - Interceptor for { >> > http://rs.security.xs/}Resource has thrown exception, unwinding now >> > >> > java.lang.IllegalStateException: WRITER >> > >> > at org.eclipse.jetty.server.Response.getOutputStream(Response.java:906) >> > ~[na:na] >> > >> > at >> > >> org.apache.cxf.transport.http.AbstractHTTPDestination.flushHeaders(Abstra >> > ctHTTPDestination.java:585) >> > [cxf-rt-transports-http-2.7.11.jar:2.7.11] >> > >> > at >> > org.apache.cxf.transport.http.AbstractHTTPDestination$WrappedOutputStre >> > am.close(AbstractHTTPDestination.java:743) >> > ~[cxf-rt-transports-http-2.7.11.jar:2.7.11] >> > >
