2015-01-04 2 views
0
제가 아파치 낙타의 새로운 REST의 DSL을 사용하고

다음과 같은 구성이 : 나는 API/핸드 쉐이크 경로를 싶습니다 낙타 2.14.1 나머지 DSL 믹스 JSON 및 XML 응답

restConfiguration().component("jetty").host("0.0.0.0").port(24999).bindingMode(RestBindingMode.auto).dataFormatProperty("prettyPrint", "true"); 

    rest("api/handshake") 
      .post().id("Handshake Route").type(SessionRequest.class).outType(SessionResponse.class).to("bean:restHandshakeApi?method=testHandshake"); 

    rest("api/message"). 
      produces("application/json"). 
      get().id("GetMessages").to("bean:restMessageApi?method=getAllMessages"); 

가 같은 응답을 포맷하기를 XML 및 api/message 라우트를 사용하여 응답을 JSON으로 형식화합니다. API를 위의 구성을/악수 XML 제대로 응답하지만 API/메시지에 액세스하려고 할 때 다음과 같은 오류 메시지가 얻을 :

java.io.IOException: org.apache.camel.InvalidPayloadException: No body available of type: javax.xml.bind.JAXBElement but has value: [] of type: java.util.ArrayList on: Message: []. Exchange[Message: []] 
at org.apache.camel.converter.jaxb.JaxbDataFormat.marshal(JaxbDataFormat.java:141) 
at org.apache.camel.processor.MarshalProcessor.process(MarshalProcessor.java:81) 
at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:105) 
at org.apache.camel.processor.MarshalProcessor.process(MarshalProcessor.java:50) 
at org.apache.camel.processor.binding.RestBindingProcessor$RestBindingMarshalOnCompletion.onAfterRoute(RestBindingProcessor.java:338) 
at org.apache.camel.util.UnitOfWorkHelper.afterRouteSynchronizations(UnitOfWorkHelper.java:154) 
at org.apache.camel.impl.DefaultUnitOfWork.afterRoute(DefaultUnitOfWork.java:273) 
at org.apache.camel.processor.CamelInternalProcessor$RouteLifecycleAdvice.after(CamelInternalProcessor.java:310) 
at org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:240) 
at org.apache.camel.processor.Pipeline.process(Pipeline.java:106) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
at org.apache.camel.component.jetty.CamelContinuationServlet.service(CamelContinuationServlet.java:150) 
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.handler.ResourceHandler.handle(ResourceHandler.java:406) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 
at org.eclipse.jetty.server.Server.handle(Server.java:370) 
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494) 
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:644) 
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) 
Caused by: org.apache.camel.InvalidPayloadException: No body available of type: javax.xml.bind.JAXBElement but has value: [] of type: java.util.ArrayList on: Message: []. Exchange[Message: []] 
    at org.apache.camel.converter.jaxb.JaxbDataFormat.marshal(JaxbDataFormat.java:175) 
    at org.apache.camel.converter.jaxb.JaxbDataFormat.marshal(JaxbDataFormat.java:138) 
    ... 33 more 

getAllMessages 방법은 어떤 JAXB 주석없이 간단한 POJO의 컬렉션을 반환합니다. json으로 bindingMode를 설정하면 api/message는 잘 작동하지만 물론 api/handshake는 작동하지 않습니다.

이와 같은 데이터 형식을 혼합 할 수 있습니까? 작동 시키려면 무엇을 변경해야합니까?

답변

0

나는 그것을 작업 가지고, 나는 이런 식으로 해결 :

restConfiguration().component("jetty").host("0.0.0.0").port(24999).bindingMode(RestBindingMode.json).dataFormatProperty("prettyPrint", "true"); 

rest("api/handshake"). 
bindingMode(RestBindingMode.xml). 
     post().id("Handshake Route").type(SessionRequest.class).outType(SessionResponse.class).to("bean:restHandshakeApi?method=testHandshake"); 

rest("api/message"). 
     produces("application/json"). 
     get().id("GetMessages").to("bean:restMessageApi?method=getAllMessages"); 

트릭은 핸드 쉐이크 경로에 bindingmode을 추가했다. 대부분의 서비스에서 JSon을 사용하기 때문에 전 세계적으로 json을 설정했습니다.

+0

헤더의 Content-Type을 application/json으로 설정하는 동안 동일한 문제가 해결되었습니다. XML로 나는 \t \t \t \t 응용 프로그램/JSON 같은 짓을 –