【发布时间】: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