当前位置: 首页 > 知识库问答 >
问题:

Camel 2.14.1 Rest DSL混合JSON和XML响应

翟奕
2023-03-14

我正在Apache Camel中使用新的REST DSL,配置如下:

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");
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集合。如果我将bindingMode设置为json,API/message可以正常工作,但API/handshake当然不行。

这样混合数据格式可能吗?我需要更改什么才能使它正常工作?

共有1个答案

强安和
2023-03-14

我把它弄好了,我这样解决它:

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。

 类似资料:
  • 问题内容: 我正在构建一个新的应用程序,该应用程序通过java配置而不是xml配置spring。此应用程序依赖于使用xml样式配置的模块。当我尝试启动我的应用程序时,出现以下错误: 该bean应该在模块的applicationContext.xml中声明。处理此问题的正确方法是什么?我尝试简单地添加它,就像我在应用程序的web.xml中将应用程序上下文串联在一起时一样: 但是我仍然遇到同样的错误。

  • 问题内容: 尝试按我想要的顺序打印页面时出现问题。在我的代码中,我输入了以下内容: 但是,当我看到页面上的显示时,它显示: JSON格式的字符串: 我需要按用户ID,数量和成功的顺序排列。已经尝试在代码中重新排序,但无济于事。我也尝试过....需要一些帮助,谢谢!! 问题答案: 你不能也不应该依赖JSON对象中元素的顺序。 来自http://www.json.org/的JSON规范 对象是名称/值

  • 我在这里看到了一个类似的问题,但它并没有帮助我解决这个问题,所以我在这里发布我的问题,看看是否有人可以修改我的代码使其工作。 问:如何访问混合内容字符串值并将其保存在 setPhrase(字符串值)方法中? 标题.xml: 标题.java: 在使用JAXB解组和编组之后,我能够将所有内容转换为和对象并保存为相应的内容,但实际短语“Hello World”除外。我知道我必须为这个复杂的元素使用某种@

  • 问题内容: 我有这个ajax请求,可从服务器获取数据,并且默认情况下始终是。但是有时它会从服务器返回json,所以我想检查返回的数据是否为html,然后执行A,否则执行B。可能吗? 我的jQuery 当返回的数据为时,出现此错误, 语法错误:JSON.parse:意外字符 那么如何使此代码 通用 ? 问题答案: 我不确定是否有更好的方法,但是您可以尝试…

  • 问题内容: 是否有人将Hamcrest与TestNG集成在一起,以便其匹配器可以轻松地用于TestNG断言中? 问题答案: 简而言之,要回答您的问题:您不需要将TestNG与Hamcrest集成。只需直接调用哪个抛出。 背景 我通过Google找到了您的问题,想知道完全一样的问题。在进一步谷歌搜索之后,我没有找到满意的答案,因此我阅读了JUnit与Hamcrest集成的源代码。 对于JUnit,通

  • 问题内容: 我一直在用Python开发一个库,我想做一些性能改进。 是否可以在Python中编写一些代码并在Go中编写一些代码,并在它们之间传递数据?如果可能的话,是否有任何有关此操作的示例? 像这样: 问题答案: 你需要一个 胶 之间,例如编程语言或通信通过网络。如果您将https://docs.python.org/2/extending/extending.html与http://golan