出于某种原因 - 并且不要问我为什么 - 我需要将一个简单的数据传输对象(DTO)传递到我的路线中。此DTO包含构建HTTP URL所需的值,该URL在路由中称为更远。我想用消息调用HTTP url(返回JSON的REST调用)返回的任何对象替换消息体中的DTO。
我完成了所有这些工作,但对我的解决方案不太满意:
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调用的响应替换。
我会将他的观点奖励给他/她,他/她可以向我展示一个更优雅的(并且更少hacky)解决方案。
答案 0 :(得分:0)
为什么需要空请求有效负载可能会发生几件事:
Serializable
,因此无法通过电子邮件发送。关于进一步简化 ......
默认情况下,Camel会将原始邮件存储在UnitOfWork
(UoW)中,您可以通过getOriginalInMessage()
访问它。
因此,即使您将主体设置为null
,原始的IN主体仍然可以访问。所以从理论上讲,您可以执行以下操作来减少 LoC计数:
from("direct:callRouteWithDtoInBody")
.setBody(constant(null))
.toD("{{host}}/video?pageNumber=${exchange.unitOfWork.originalInMessage.body.pageNumber}");
但是,由于Camel中OGNL
和bean绑定逻辑的一些限制,我还没有设法找到一个可行的解决方案。 Camel无法处理:
getBody()
(它丢弃抽象的方法) - 也不 - body
(它认为它含糊不清)。实际上,getBody()
应该有效,但遗憾的是this ticket从2.15.3和2.16.0开始,从考虑中删除了所有抽象方法(我不同意这个理由)。
由于您使用的是toD
DSL,因此我可以推断您所在的> = 2.16.0 ,因此如果您的优先级为优先级,我就无法为您提供有效的解决方案减少代码行指标。但是,如果你想,我们可以考虑其他解决方案。请在评论中提问,我会更新答案。
但是我会在社区处理这个问题(我是提交者和PMC)。