There may be some code left there which still prints it to the stdout.
I'll deal with it next week
Sergey
On 09/01/15 15:17, nikosdim wrote:
I have a POST service that gets either xml or json in the request paylod and
returns an xml or json response. I use
org.apache.cxf.jaxrs.provider.json.JSONProvider and
org.apache.cxf.jaxrs.provider.JAXBElementProvider for the data binding.

I am looking for a way to handle exceptions thrown from these providers when
an invalid request body is given to the service. I have registered an
ExceptionMapper<Exception> as a provider to the server and it is catch the
exceptions but in some cases I still get a exception stacktrace to my
stdout.

Here is my configuration

Service :

@Path("incident")
public class IncidentService {

     @POST
     @Consumes({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
     public Response createIncident(Incident incident) {
         //...code
         //...more code
     }
}
Exception Mapper:
@Provider
public class ExceptionHandler implements ExceptionMapper<Exception> {

     @Context
     private HttpServletRequest request;

     @Override
     public Response toResponse(Exception exception) {

         String accept = request.getHeader("Accept");
         String mediaType = null;
         if(accept.equals("application/xml")){
             mediaType = "application/xml";
         } else {
             mediaType = "application/json";
         }

         IncidentServiceResponse res = new IncidentServiceResponse();
         res.setErrorMessage(exception.getMessage() + " - " +
exception.getCause().getMessage());

         return Response.status(400).entity(res).type(mediaType).build();
     }
}

Config:

<jaxrs:server address="/">
     <jaxrs:serviceBeans>
         <bean class="com.ba.sysman.services.events.IncidentService"></bean>
     </jaxrs:serviceBeans>
     <jaxrs:providers>
         <bean
class="org.apache.cxf.jaxrs.provider.json.JSONProvider"></bean>
         <bean
class="org.apache.cxf.jaxrs.provider.JAXBElementProvider"></bean>
         <bean class="com.ba.sysman.providers.ExceptionHandler"></bean>
     </jaxrs:providers>
</jaxrs:server>
Test Cases:

When sending a request with no body in it I get nothing to stdout and the
response below which is what I want.

<response>
     <errorMessage>HTTP 400 Bad Request - Unexpected EOF in prolog at
[row,col {unknown-source}]: [2,0]</errorMessage>
</response>

When I send and invalid request body, lets say Content-Type is set to xml
and I send "abc123" as a body, the response that I get is what I expect
(shown below) but I get a stacktrace to stdout (show below again).

<response>
     <errorMessage>HTTP 400 Bad Request - Unexpected character 'a' (code 97)
in prolog; expected '<' at [row,col {unknown-source}]: [1,1]</errorMessage>
</response>

WARNING: javax.xml.bind.UnmarshalException
  - with linked exception:
[com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character 'a'
(code 97) in prolog; expected '<'
  at [row,col {unknown-source}]: [1,1]]
     at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:485)
     at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:417)
     at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:386)
     at
org.apache.cxf.jaxrs.provider.JAXBElementProvider.unmarshalFromInputStream(JAXBElementProvider.java:291)
     at
org.apache.cxf.jaxrs.provider.JAXBElementProvider.doUnmarshal(JAXBElementProvider.java:242)
     at
org.apache.cxf.jaxrs.provider.JAXBElementProvider.readFrom(JAXBElementProvider.java:191)
     at
org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBodyReader(JAXRSUtils.java:1325)
     at
org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1276)
     at
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameter(JAXRSUtils.java:815)
     at
org.apache.cxf.jaxrs.utils.JAXRSUtils.processParameters(JAXRSUtils.java:778)
     at
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:212)
     at
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:77)
     at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
     at
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
     at
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:243)
     at
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
     at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:197)
     at
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:149)
     at
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:171)
     at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
     at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:206)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
     at
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
     at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
     at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
     at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
     at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
     at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
     at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
     at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
     at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
     at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
     at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
     at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
     at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
     at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
     at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
     at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
     at java.lang.Thread.run(Thread.java:745)
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected
character 'a' (code 97) in prolog; expected '<'
  at [row,col {unknown-source}]: [1,1]
     at
com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:647)
     at
com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2054)
     at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1131)
     at
com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:164)
     at
com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:415)
     ... 37 more


What is the proper way to handle these exceptions and how can I prevent get
stack traces to my stdout?

Thanks



--
View this message in context: 
http://cxf.547215.n5.nabble.com/CXF-How-to-handle-exceptions-thrown-from-providers-tp5752908.html
Sent from the cxf-user mailing list archive at Nabble.com.



--
Sergey Beryozkin

Talend Community Coders
http://coders.talend.com/

Blog: http://sberyozkin.blogspot.com

Reply via email to