出于某种原因 - 不要问我为什么 - 我需要将一个简单的数据传输对象(DTO)传递到我的 route 。此 DTO 保存构造 HTTP url 所需的值,该 URL 会在路由中进一步调用。我想将消息正文中的 DTO 替换为调用 HTTP url(返回 JSON 的 REST 调用)返回的任何对象。
我完成了所有这些工作,但是对我的解决方案不太满意:
from("direct:callRouteWithDtoInBody")
.setHeader("url", simple("{{host}}/video?pageNumber=${body.pageNumber}"))
// need to empty body, otherwise ensuing call to http component won't overwrite message payload
.setBody(simple("null"))
.toD("${header.url}")
如您所见,我使用了一些技巧来替换正文消息:我事先清除了正文。如果我不清除正文,原始消息(DTO)将不会被 HTTP 调用的响应替换。
我会将我的积分奖励给能够向我展示更优雅的(且不那么老套)解决方案的他/她。
最佳答案
可能会发生以下几种情况,导致您需要空请求负载:
- 服务器不喜欢 GET 请求中的请求负载,或者由于存在负载而以不同的方式处理请求。
- 您的 DTO 不可
可序列化
,因此无法通过网络发送。
关于进一步简化...
Camel 默认将原始消息存储在 UnitOfWork
(UoW) 中,您可以通过 getOriginalInMessage()
访问它.
因此,即使将正文设置为 null
,原始 IN 正文仍然可以访问。因此理论上您可以执行以下操作来减少LoC 计数:
from("direct:callRouteWithDtoInBody")
.setBody(constant(null))
.toD("{{host}}/video?pageNumber=${exchange.unitOfWork.originalInMessage.body.pageNumber}");
但是,由于 OGNL
中的一些限制和 Camel 中的 bean 绑定(bind)逻辑,我还没有找到有效的解决方案。 Camel 无法处理:
getBody()
(它丢弃了抽象方法) – 也不 –body
(它认为它是不明确的)。
实际上,getBody()
应该可以工作,但不幸的是this ticket从 2.15.3 和 2.16.0 开始,删除了所有抽象方法(我不同意这个理由)。
由于您使用的是 toD
DSL,我可以推断您使用的是 >= 2.16.0,因此如果您的首要任务是减少代码行指标,我无法为您提供可行的解决方案。不过,如果您愿意,我们可以考虑其他解决方案;只需在评论中提问,我会更新答案。
但我会在社区处理这个问题(我是提交者和 PMC)。
关于java - Camel 路由 - 用 HTTP 负载替换消息正文中的 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34785113/