Camel Routing - 使用HTTP有效负载替换消息体中的DTO

时间:2016-01-14 08:49:37

标签: java apache-camel

出于某种原因 - 并且不要问我为什么 - 我需要将一个简单的数据传输对象(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)解决方案。

1 个答案:

答案 0 :(得分:0)

为什么需要空请求有效负载可能会发生几件事:

  1. 服务器不喜欢GET请求中的请求有效负载,或者由于有效负载存在而以不同方式处理请求。
  2. 您的DTO不是Serializable,因此无法通过电子邮件发送。
  3. 关于进一步简化 ......

    默认情况下,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无法处理:

    1. getBody()(它丢弃抽象的方法) - 也不 -
    2. body(它认为它含糊不清)。
    3. 实际上,getBody()应该有效,但遗憾的是this ticket从2.15.3和2.16.0开始,从考虑中删除了所有抽象方法(我不同意这个理由)。

      由于您使用的是toD DSL,因此我可以推断您所在的> = 2.16.0 ,因此如果您的优先级为优先级,我就无法为您提供有效的解决方案减少代码行指标。但是,如果你想,我们可以考虑其他解决方案。请在评论中提问,我会更新答案。

      但是我会在社区处理这个问题(我是提交者和PMC)。