Java 驼峰路由-用HTTP负载替换消息体中的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=$

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


我将把我的分数奖励给他/她,他/她可以向我展示一个更优雅的(且不太老套的)解决方案。

您需要空请求负载的原因可能是:

  • 服务器不喜欢GET请求中的请求有效负载,或者由于存在有效负载而以不同方式处理请求
  • 您的DTO不可
    序列化
    ,因此无法在线发送
  • 关于进一步简化

    默认情况下,Camel将原始消息存储在
    工作单元(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}");