Hi Sergey, thanks for your suggestion. I'll try and I'll let you know. Anyway the method that I "posted" in my previous email was just an example to keep the things easy. The filter has not just for logging purposes What I really need to do in the filter is to calculate the MD5 of the payload.
Thanks and Regards Gaetano On 22 July 2013 21:41, Sergey Beryozkin <[email protected]> wrote: > Hi - Looks like you've consumed InputStream without restoring it - please > do that and it should work, why don't you use CXF LoggingFeature ? > > Cheers, Sergey > > On 22/07/13 19:27, Gaetano Ciotola wrote: > >> Hello, >> I have developed a simple web service using CXF JAX-RS. >> I need to access to the plain json payload from the request >> I have done some research and I decided to us JAX-RS Filter. >> The filter's logic is really simple: retrieve the payload and write a log. >> >> public class TestHandler implements RequestHandler >> { >> private static final Category logger = >> Category.getInstance(**TestHandler.class); >> @Override >> public Response handleRequest(Message msg, ClassResourceInfo clsResInfo) >> { >> InputStream is = msg.getContent(InputStream.**class); >> StringWriter writer = new StringWriter(); >> try { >> IOUtils.copy(is, writer, "utf-8"); >> } catch (IOException e) { >> e.printStackTrace(); >> } >> IOUtils.closeQuietly(is); >> String body = writer.toString(); >> logger.info(body); >> >> return null; >> } >> } >> >> The problem is that somehow the request get corrupted (i.e. the body get >> removed) and when the Jettison start to process it, the following >> exception get thrown: >> >> [7/22/13 18:41:36:305 BST] 00000024 WebApplicatio W >> javax.ws.rs.**BadRequestException: javax.xml.stream.**XMLStreamException: >> Missing value. at character 27 of {"PaymentAuthorisationReq":} >> at >> org.apache.cxf.jaxrs.provider.**AbstractJAXBProvider.** >> handleExceptionEnd(**AbstractJAXBProvider.java:671) >> at >> org.apache.cxf.jaxrs.provider.**AbstractJAXBProvider.** >> handleXMLStreamException(**AbstractJAXBProvider.java:688) >> at >> org.apache.cxf.jaxrs.provider.**json.JSONProvider.readFrom(** >> JSONProvider.java:248) >> at >> org.apache.cxf.jaxrs.utils.**JAXRSUtils.**readFromMessageBodyReader(** >> JAXRSUtils.java:1288) >> at >> org.apache.cxf.jaxrs.utils.**JAXRSUtils.**readFromMessageBody(** >> JAXRSUtils.java:1236) >> at >> org.apache.cxf.jaxrs.utils.**JAXRSUtils.processParameter(** >> JAXRSUtils.java:787) >> at >> org.apache.cxf.jaxrs.utils.**JAXRSUtils.processParameters(** >> JAXRSUtils.java:747) >> at >> org.apache.cxf.jaxrs.**interceptor.**JAXRSInInterceptor.**processRequest( >> **JAXRSInInterceptor.java:240) >> at >> org.apache.cxf.jaxrs.**interceptor.**JAXRSInInterceptor.**handleMessage(* >> *JAXRSInInterceptor.java:100) >> at >> org.apache.cxf.phase.**PhaseInterceptorChain.**doIntercept(** >> PhaseInterceptorChain.java:**271) >> at >> org.apache.cxf.transport.**ChainInitiationObserver.**onMessage(** >> ChainInitiationObserver.java:**121) >> at >> org.apache.cxf.transport.http.**AbstractHTTPDestination.**invoke(** >> AbstractHTTPDestination.java:**239) >> at >> org.apache.cxf.transport.**servlet.ServletController.**invokeDestination( >> **ServletController.java:223) >> at >> org.apache.cxf.transport.**servlet.ServletController.** >> invoke(ServletController.java:**203) >> at >> org.apache.cxf.transport.**servlet.ServletController.** >> invoke(ServletController.java:**137) >> at >> org.apache.cxf.transport.**servlet.CXFNonSpringServlet.** >> invoke(CXFNonSpringServlet.**java:158) >> at >> org.apache.cxf.transport.**servlet.AbstractHTTPServlet.**handleRequest(** >> AbstractHTTPServlet.java:243) >> at >> org.apache.cxf.transport.**servlet.AbstractHTTPServlet.** >> doPost(AbstractHTTPServlet.**java:163) >> at javax.servlet.http.**HttpServlet.service(**HttpServlet.java:738) >> at >> org.apache.cxf.transport.**servlet.AbstractHTTPServlet.** >> service(AbstractHTTPServlet.**java:219) >> at >> com.ibm.ws.webcontainer.**servlet.ServletWrapper.** >> service(ServletWrapper.java:**1657) >> at >> com.ibm.ws.webcontainer.**servlet.ServletWrapper.** >> handleRequest(ServletWrapper.**java:939) >> at >> com.ibm.ws.webcontainer.**servlet.ServletWrapper.** >> handleRequest(ServletWrapper.**java:502) >> at >> com.ibm.ws.webcontainer.**servlet.ServletWrapperImpl.**handleRequest(** >> ServletWrapperImpl.java:179) >> at com.ibm.ws.webcontainer.**webapp.WebApp.handleRequest(** >> WebApp.java:3826) >> at com.ibm.ws.webcontainer.**webapp.WebGroup.handleRequest(** >> WebGroup.java:276) >> at com.ibm.ws.webcontainer.**WebContainer.handleRequest(** >> WebContainer.java:931) >> at >> com.ibm.ws.webcontainer.**WSWebContainer.handleRequest(** >> WSWebContainer.java:1583) >> at >> com.ibm.ws.webcontainer.**channel.WCChannelLink.ready(** >> WCChannelLink.java:186) >> at >> com.ibm.ws.http.channel.**inbound.impl.HttpInboundLink.** >> handleDiscrimination(**HttpInboundLink.java:445) >> at >> com.ibm.ws.http.channel.**inbound.impl.HttpInboundLink.** >> handleNewRequest(**HttpInboundLink.java:504) >> at >> com.ibm.ws.http.channel.**inbound.impl.HttpInboundLink.**processRequest(* >> *HttpInboundLink.java:301) >> at >> com.ibm.ws.http.channel.**inbound.impl.HttpInboundLink.** >> ready(HttpInboundLink.java:**275) >> at >> com.ibm.ws.tcp.channel.impl.**NewConnectionInitialReadCallba** >> ck.sendToDiscriminators(**NewConnectionInitialReadCallba**ck.java:214) >> at >> com.ibm.ws.tcp.channel.impl.**NewConnectionInitialReadCallba** >> ck.complete(**NewConnectionInitialReadCallba**ck.java:113) >> at >> com.ibm.ws.tcp.channel.impl.**AioReadCompletionListener.** >> futureCompleted(**AioReadCompletionListener.**java:165) >> at >> com.ibm.io.async.**AbstractAsyncFuture.**invokeCallback(** >> AbstractAsyncFuture.java:217) >> at >> com.ibm.io.async.**AsyncChannelFuture.**fireCompletionActions(** >> AsyncChannelFuture.java:161) >> at com.ibm.io.async.AsyncFuture.**completed(AsyncFuture.java:**138) >> at com.ibm.io.async.**ResultHandler.complete(**ResultHandler.java:204) >> at >> com.ibm.io.async.**ResultHandler.**runEventProcessingLoop(** >> ResultHandler.java:775) >> at com.ibm.io.async.**ResultHandler$2.run(**ResultHandler.java:905) >> at com.ibm.ws.util.ThreadPool$**Worker.run(ThreadPool.java:**1563) >> Caused by: javax.xml.stream.**XMLStreamException: Missing value. at >> character >> 27 of {"PaymentAuthorisationReq":} >> at >> org.codehaus.jettison.mapped.**MappedXMLInputFactory.** >> createXMLStreamReader(**MappedXMLInputFactory.java:51) >> at >> org.codehaus.jettison.**AbstractXMLInputFactory.**createXMLStreamReader(* >> *AbstractXMLInputFactory.java:**116) >> at >> org.codehaus.jettison.**AbstractXMLInputFactory.**createXMLStreamReader(* >> *AbstractXMLInputFactory.java:**103) >> at >> org.apache.cxf.jaxrs.provider.**json.utils.JSONUtils.** >> createStreamReader(JSONUtils.**java:157) >> at >> org.apache.cxf.jaxrs.provider.**json.JSONProvider.** >> createReader(JSONProvider.**java:273) >> at >> org.apache.cxf.jaxrs.provider.**json.JSONProvider.** >> createReader(JSONProvider.**java:263) >> at >> org.apache.cxf.jaxrs.provider.**json.JSONProvider.readFrom(** >> JSONProvider.java:221) >> ... 40 more >> Caused by: org.codehaus.jettison.json.**JSONException: Missing value. at >> character 27 of {"PaymentAuthorisationReq":} >> at org.codehaus.jettison.json.**JSONTokener.syntaxError(** >> JSONTokener.java:463) >> at org.codehaus.jettison.json.**JSONTokener.nextValue(** >> JSONTokener.java:356) >> at org.codehaus.jettison.json.**JSONObject.<init>(JSONObject.**java:199) >> at >> org.codehaus.jettison.mapped.**MappedXMLInputFactory.**createJSONObject(* >> *MappedXMLInputFactory.java:59) >> at >> org.codehaus.jettison.mapped.**MappedXMLInputFactory.** >> createXMLStreamReader(**MappedXMLInputFactory.java:44) >> ... 46 more >> >> During my investigation I have added a second filter (that is exactly the >> copy of the existing one) and debugging, I can see that when the request >> get caught by the second filter, the body is empty....As said it seems >> that the logic in the first filter "consumes the request's body" >> >> Note - if in the filter I just do retrieve the InputStreem all works fine >> public Response handleRequest(Message msg, ClassResourceInfo clsResInfo) >> { >> InputStream is = msg.getContent(InputStream.**class); >> return null; >> } >> Possibly is something really simple that I'm missing >> >> Any help would be really appreciated >> >> Thanks and Regards >> Gaetano >> >> > > -- > Sergey Beryozkin > > Talend Community Coders > http://coders.talend.com/ > > Blog: http://sberyozkin.blogspot.com >
