Java 驼峰路由-用HTTP负载替换消息体中的DTO
出于某种原因——不要问我为什么——我需要将一个简单的数据传输对象(DTO)传递到我的路由中。此DTO保存构造HTTP url所需的值,该url在路由中进一步调用。我想用调用HTTP url(返回JSON的REST调用)返回的任何对象替换消息体中的DTO 我让所有这些都起作用了,但我对我的解决方案不太满意Java 驼峰路由-用HTTP负载替换消息体中的DTO,java,apache-camel,Java,Apache Camel,出于某种原因——不要问我为什么——我需要将一个简单的数据传输对象(DTO)传递到我的路由中。此DTO保存构造HTTP url所需的值,该url在路由中进一步调用。我想用调用HTTP url(返回JSON的REST调用)返回的任何对象替换消息体中的DTO 我让所有这些都起作用了,但我对我的解决方案不太满意 from("direct:callRouteWithDtoInBody") .setHeader("url", simple("{{host}}/video?pageNumber=$
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调用的响应替换
我将把我的分数奖励给他/她,他/她可以向我展示一个更优雅的(且不太老套的)解决方案。您需要空请求负载的原因可能是:
序列化
,因此无法在线发送工作单元(UoW)中,您可以通过访问
因此,即使将正文设置为null
,原始的IN正文仍然可以访问。因此,理论上,您可以采取以下措施来减少LoC计数:
然而,由于Camel中的和bean绑定逻辑的一些限制,我还没有找到一个有效的解决方案。Camel无法处理以下问题:
getBody()
(它放弃了抽象的方法)–或者-
正文
(它认为它不明确)
实际上,getBody()
应该可以工作,但不幸的是,从2.15.3和2.16.0开始,所有的抽象方法都被删除了(我不同意这个理由)
由于您使用的是toD
DSL,因此我可以推断您使用的是>=2.16.0,因此如果您的首要任务是减少代码行度量,那么我无法为您提供有效的解决方案。但是,如果你想要< /强>,我们可以考虑其他强的解决方案;只要在评论中提问,我就会更新答案
但我会在社区中解决这个问题(我是提交者和PMC)。为什么需要空请求负载,可能会发生一些事情:
服务器不喜欢GET请求中的请求有效负载,或者由于存在有效负载而以不同方式处理请求
您的DTO不可序列化
,因此无法在线发送
关于进一步简化
默认情况下,Camel将原始消息存储在工作单元(UoW)中,您可以通过访问
因此,即使将正文设置为null
,原始的IN正文仍然可以访问。因此,理论上,您可以采取以下措施来减少LoC计数:
然而,由于Camel中的和bean绑定逻辑的一些限制,我还没有找到一个有效的解决方案。Camel无法处理以下问题:
getBody()
(它放弃了抽象的方法)–或者-
正文
(它认为它不明确)
实际上,getBody()
应该可以工作,但不幸的是,从2.15.3和2.16.0开始,所有的抽象方法都被删除了(我不同意这个理由)
由于您使用的是toD
DSL,因此我可以推断您使用的是>=2.16.0,因此如果您的首要任务是减少代码行度量,那么我无法为您提供有效的解决方案。但是,如果你想要< /强>,我们可以考虑其他强的解决方案;只要在评论中提问,我就会更新答案
但我会在社区里处理这个问题(我是一个提交人和PMC)。如果你在前面附加到end.log(${in.body})并删除那个setBody,body仍然是那个DTO吗?如果你在前面附加到end.log(${in.body})并删除那个setBody,body仍然是那个DTO吗?
from("direct:callRouteWithDtoInBody")
.setBody(constant(null))
.toD("{{host}}/video?pageNumber=${exchange.unitOfWork.originalInMessage.body.pageNumber}");