On 23/07/13 12:45, Gaetano Ciotola wrote:
Hi Sergey,
just to let you know that restoring the InputStream it works.
Thanks
OK, thanks for the update,
Sergey
  Gaetano


On 22 July 2013 23:00, Gaetano Ciotola <[email protected]> wrote:

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









--
Sergey Beryozkin

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

Blog: http://sberyozkin.blogspot.com

Reply via email to