java - Camel 路由 - 用 HTTP 负载替换消息正文中的 DTO

标签 java apache-camel

出于某种原因 - 不要问我为什么 - 我需要将一个简单的数据传输对象(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 调用的响应替换。

我会将我的积分奖励给能够向我展示更优雅的(且不那么老套)解决方案的他/她。

最佳答案

可能会发生以下几种情况,导致您需要空请求负载:

  1. 服务器不喜欢 GET 请求中的请求负载,或者由于存在负载而以不同的方式处理请求。
  2. 您的 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 无法处理:

  1. getBody()(它丢弃了抽象方法) – 也不 –
  2. 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/

相关文章:

xml - 使用自定义拆分方法的 Camel 拆分器

java - Apache Camel + QPid 将 messageid 设置为 UUID 不起作用

java - 使用 Jackson 在变量名转换为 JSON 转换中使用斜杠的 POJO

java - Apache Camel onException 和 deadLetterChannel 问题

java - 使用 GWT JNSI 从 Javascript 调用 Java

java - 尝试在Mac上编译使用jsoup包的java程序

java - 如何观察整个 Camel 路线

java - 使用camel聚合器接收多封电子邮件时遇到问题

java - 等待/通知的无锁变体

java - Axis2 测试客户端错误