【问题标题】:Camel Jetty response is Object ID instead of XML generated by JAXBCamel Jetty 响应是 Object ID 而不是 JAXB 生成的 XML
【发布时间】:2023-03-29 13:56:01
【问题描述】:

我正在开发一个 Apache Camel 项目。基本上,Jetty 端点接受一个 Http Post 请求,并且消息在路由中经过几个转换步骤。转换的最后一步是通过 JAXB,它将 Java 对象转换为 XML。 Java DSL 在下面

final DataFormat jaxb = new JaxbDataFormat("sample");
from("jetty:http://localhost:8888/foo")
.unmarshal(format).split(body()).marshal(jaxb)

我的问题是当我向本地主机 URL 发送 POST 请求时,HTTP 响应是字符串 [sample.Claims@b68e0e],不是我期望的 XML。这是 JAXB 对象 ID。当我将 DSL 更改为

from("jetty:http://localhost:8888/foo")
.unmarshal(format).split(body()).marshal(jaxb).to("stream:out")

我可以看到在标准输出中正确打印出 XML。我不知道如何使 HTTP 响应包含 XML 而不是对象 ID。任何帮助表示赞赏。

更新:

我想澄清我试图完成的工作。 我需要将分隔字符串转换为 xml 文档。发送到 Jetty 端点的消息是一个分隔字符串。该路由首先使用 BeanIO 将字符串转换为 POJO,然后使用 JAXB 将 POJO 转换为 XML。即使发布消息是单行字符串,我也必须使用 split() 因为 BeanIO 默认处理多行平面文件。我遵循@Peter 的建议,在 jaxb 编组之后添加 aggegate,如下所示

from("jetty:http://localhost:8888/transformProxy/ECSProxy")
.unmarshal(format).split(body()).marshal(jaxb)
.aggregate(constant("1"),new MyAggregationStrategy())
.completionSize(1).to("stream:out");

但它似乎没有任何区别。我仍然得到 [sample.Claims@1a631c2] 作为 Http 响应正文,而标准输出打印出正确的 xml 文档。我不确定如何/何时设置码头端点的响应主体。

【问题讨论】:

  • 您是否尝试在编组到 XML 之后添加 convertBodyTo(String.class)
  • 正文被拆分为单个部分,但拆分未聚合。也许这就是问题所在。
  • @Ralf 我尝试了 converBodyTo 方法,但没有帮助。结果仍然是objectId。不过谢谢你的建议。
  • @Peter 感谢您的回复。我在 marshal(jaxb) 之后将聚合添加为 marshal(jaxb).aggregate(constant("1"),new MyAggregationStrategy()).completionSize(1).to("stream:out")。问题是一样的。标准输出打印出正确的 xml,而 Jetty 响应仅显示 [sample.Claims@1a631c2]

标签: jaxb apache-camel


【解决方案1】:

我通过将聚合策略作为拆分的第二个参数来实现它。详情请见https://camel.apache.org/splitter.html。搜索“拆分聚合请求/回复示例

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2021-08-23
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多