You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Tim Dudgeon <td...@gmail.com> on 2015/06/22 19:18:27 UTC

REST DSL conundrum

I'm struggling with a REST DSL. It handles a POST request for a file 
upload, so the request body is binary type, and the response is JSON 
describing the result. The container is Jetty.

My DSL looks like this:

rest("/rest/v1/datasets")
.post().description("Upload file to create new dataset")
.bindingMode(RestBindingMode.off)
.produces("application/json")
.route()
.to("direct:process_the_body")          // this processed the body and 
returns a result object
.marshal().json(JsonLibrary.Jackson) // which here is converted to JSON
.log("marshal complete. JSON is ${body}")
.endRest()

Its all working fine, and the JSON gets marshalled correctly (the log() 
statement
By the request fails with this error:

[qtp562561015-19] INFO route2 - marshal complete. JSON is 
{"id":13,"name":"big_bad","size":null,"metadata":{"type":"ITEM","className":"java.util.stream.ReferencePipeline$Head","size":1},"created":1434992702164,"updated":1434992702164,"loid":333226}
[qtp562561015-19] WARN org.eclipse.jetty.server.AbstractHttpConnection - 
header full: java.lang.RuntimeException: Header>6144
[qtp562561015-19] ERROR 
org.apache.camel.component.jetty.CamelContinuationServlet - Error 
processing request
HttpException(500,null,null)
at 
org.eclipse.jetty.server.AbstractHttpConnection.commitResponse(AbstractHttpConnection.java:645)
at 
org.eclipse.jetty.server.AbstractHttpConnection$Output.flush(AbstractHttpConnection.java:1122)
at org.apache.camel.util.IOHelper.copy(IOHelper.java:201)
at 
org.apache.camel.component.http.DefaultHttpBinding.copyStream(DefaultHttpBinding.java:318)
at 
org.apache.camel.component.http.DefaultHttpBinding.doWriteDirectResponse(DefaultHttpBinding.java:378)
at 
org.apache.camel.component.http.DefaultHttpBinding.doWriteResponse(DefaultHttpBinding.java:299)
at 
org.apache.camel.component.http.DefaultHttpBinding.writeResponse(DefaultHttpBinding.java:231)
at 
org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:198)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
at 
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
at 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
at 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handleAsync(Server.java:410)
at 
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:519)
at 
org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at 
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:651)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at 
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at 
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
at 
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
at 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at 
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:745)
[qtp562561015-19] WARN org.eclipse.jetty.server.Response - Committed 
before 500 null
[qtp562561015-19] WARN org.eclipse.jetty.server.AbstractHttpConnection - 
/rest/v1/datasets
java.lang.IllegalStateException: Committed
at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1130)
at org.eclipse.jetty.server.Response.sendError(Response.java:317)
at 
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1095)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
at 
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
at 
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at 
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handleAsync(Server.java:410)
at 
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:519)
at 
org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
at 
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:651)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
at 
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at 
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
at 
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
at 
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at 
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:745)

Any ideas what's wrong?

Tim


Re: REST DSL conundrum

Posted by Tim Dudgeon <td...@gmail.com>.
No, it wasn't that (though I've been caught be that in the past).
It turned out that its something strange with the result needing to be 
set to the body of the Out message, not the In message.
Not totally sure about it, but I have something that works now.

Tim

On 22/06/2015 18:21, Claus Ibsen wrote:
> Hi
>
> If it works without the log, then see this
> http://camel.apache.org/why-is-my-message-body-empty.html
>
> On Mon, Jun 22, 2015 at 7:18 PM, Tim Dudgeon <td...@gmail.com> wrote:
>> I'm struggling with a REST DSL. It handles a POST request for a file upload,
>> so the request body is binary type, and the response is JSON describing the
>> result. The container is Jetty.
>>
>> My DSL looks like this:
>>
>> rest("/rest/v1/datasets")
>> .post().description("Upload file to create new dataset")
>> .bindingMode(RestBindingMode.off)
>> .produces("application/json")
>> .route()
>> .to("direct:process_the_body")          // this processed the body and
>> returns a result object
>> .marshal().json(JsonLibrary.Jackson) // which here is converted to JSON
>> .log("marshal complete. JSON is ${body}")
>> .endRest()
>>
>> Its all working fine, and the JSON gets marshalled correctly (the log()
>> statement
>> By the request fails with this error:
>>
>> [qtp562561015-19] INFO route2 - marshal complete. JSON is
>> {"id":13,"name":"big_bad","size":null,"metadata":{"type":"ITEM","className":"java.util.stream.ReferencePipeline$Head","size":1},"created":1434992702164,"updated":1434992702164,"loid":333226}
>> [qtp562561015-19] WARN org.eclipse.jetty.server.AbstractHttpConnection -
>> header full: java.lang.RuntimeException: Header>6144
>> [qtp562561015-19] ERROR
>> org.apache.camel.component.jetty.CamelContinuationServlet - Error processing
>> request
>> HttpException(500,null,null)
>> at
>> org.eclipse.jetty.server.AbstractHttpConnection.commitResponse(AbstractHttpConnection.java:645)
>> at
>> org.eclipse.jetty.server.AbstractHttpConnection$Output.flush(AbstractHttpConnection.java:1122)
>> at org.apache.camel.util.IOHelper.copy(IOHelper.java:201)
>> at
>> org.apache.camel.component.http.DefaultHttpBinding.copyStream(DefaultHttpBinding.java:318)
>> at
>> org.apache.camel.component.http.DefaultHttpBinding.doWriteDirectResponse(DefaultHttpBinding.java:378)
>> at
>> org.apache.camel.component.http.DefaultHttpBinding.doWriteResponse(DefaultHttpBinding.java:299)
>> at
>> org.apache.camel.component.http.DefaultHttpBinding.writeResponse(DefaultHttpBinding.java:231)
>> at
>> org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:198)
>> at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
>> at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
>> at
>> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
>> at
>> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
>> at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
>> at
>> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
>> at
>> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
>> at
>> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
>> at org.eclipse.jetty.server.Server.handleAsync(Server.java:410)
>> at
>> org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:519)
>> at
>> org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
>> at
>> org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
>> at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:651)
>> at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
>> at
>> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
>> at
>> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
>> at
>> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
>> at
>> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
>> at
>> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
>> at java.lang.Thread.run(Thread.java:745)
>> [qtp562561015-19] WARN org.eclipse.jetty.server.Response - Committed before
>> 500 null
>> [qtp562561015-19] WARN org.eclipse.jetty.server.AbstractHttpConnection -
>> /rest/v1/datasets
>> java.lang.IllegalStateException: Committed
>> at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1130)
>> at org.eclipse.jetty.server.Response.sendError(Response.java:317)
>> at
>> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1095)
>> at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
>> at
>> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
>> at
>> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
>> at
>> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
>> at org.eclipse.jetty.server.Server.handleAsync(Server.java:410)
>> at
>> org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:519)
>> at
>> org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
>> at
>> org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
>> at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:651)
>> at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
>> at
>> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
>> at
>> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
>> at
>> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
>> at
>> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
>> at
>> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
>> at java.lang.Thread.run(Thread.java:745)
>>
>> Any ideas what's wrong?
>>
>> Tim
>>
>
>


Re: REST DSL conundrum

Posted by Claus Ibsen <cl...@gmail.com>.
Hi

If it works without the log, then see this
http://camel.apache.org/why-is-my-message-body-empty.html

On Mon, Jun 22, 2015 at 7:18 PM, Tim Dudgeon <td...@gmail.com> wrote:
> I'm struggling with a REST DSL. It handles a POST request for a file upload,
> so the request body is binary type, and the response is JSON describing the
> result. The container is Jetty.
>
> My DSL looks like this:
>
> rest("/rest/v1/datasets")
> .post().description("Upload file to create new dataset")
> .bindingMode(RestBindingMode.off)
> .produces("application/json")
> .route()
> .to("direct:process_the_body")          // this processed the body and
> returns a result object
> .marshal().json(JsonLibrary.Jackson) // which here is converted to JSON
> .log("marshal complete. JSON is ${body}")
> .endRest()
>
> Its all working fine, and the JSON gets marshalled correctly (the log()
> statement
> By the request fails with this error:
>
> [qtp562561015-19] INFO route2 - marshal complete. JSON is
> {"id":13,"name":"big_bad","size":null,"metadata":{"type":"ITEM","className":"java.util.stream.ReferencePipeline$Head","size":1},"created":1434992702164,"updated":1434992702164,"loid":333226}
> [qtp562561015-19] WARN org.eclipse.jetty.server.AbstractHttpConnection -
> header full: java.lang.RuntimeException: Header>6144
> [qtp562561015-19] ERROR
> org.apache.camel.component.jetty.CamelContinuationServlet - Error processing
> request
> HttpException(500,null,null)
> at
> org.eclipse.jetty.server.AbstractHttpConnection.commitResponse(AbstractHttpConnection.java:645)
> at
> org.eclipse.jetty.server.AbstractHttpConnection$Output.flush(AbstractHttpConnection.java:1122)
> at org.apache.camel.util.IOHelper.copy(IOHelper.java:201)
> at
> org.apache.camel.component.http.DefaultHttpBinding.copyStream(DefaultHttpBinding.java:318)
> at
> org.apache.camel.component.http.DefaultHttpBinding.doWriteDirectResponse(DefaultHttpBinding.java:378)
> at
> org.apache.camel.component.http.DefaultHttpBinding.doWriteResponse(DefaultHttpBinding.java:299)
> at
> org.apache.camel.component.http.DefaultHttpBinding.writeResponse(DefaultHttpBinding.java:231)
> at
> org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:198)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
> at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)
> at
> org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
> at
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)
> at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
> at
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
> at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
> at org.eclipse.jetty.server.Server.handleAsync(Server.java:410)
> at
> org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:519)
> at
> org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
> at
> org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
> at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:651)
> at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
> at
> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
> at
> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
> at
> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
> at
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
> at
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
> at java.lang.Thread.run(Thread.java:745)
> [qtp562561015-19] WARN org.eclipse.jetty.server.Response - Committed before
> 500 null
> [qtp562561015-19] WARN org.eclipse.jetty.server.AbstractHttpConnection -
> /rest/v1/datasets
> java.lang.IllegalStateException: Committed
> at org.eclipse.jetty.server.Response.resetBuffer(Response.java:1130)
> at org.eclipse.jetty.server.Response.sendError(Response.java:317)
> at
> org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1095)
> at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)
> at
> org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)
> at
> org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
> at
> org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
> at org.eclipse.jetty.server.Server.handleAsync(Server.java:410)
> at
> org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:519)
> at
> org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:971)
> at
> org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1033)
> at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:651)
> at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
> at
> org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
> at
> org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
> at
> org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
> at
> org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
> at
> org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
> at java.lang.Thread.run(Thread.java:745)
>
> Any ideas what's wrong?
>
> Tim
>



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
Email: cibsen@redhat.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen
hawtio: http://hawt.io/
fabric8: http://fabric8.io/