You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Camel路由中如何将Exchange body值传入rest:get调用步骤

Camel路由动态拼接REST端点解决方案

问题根源

你写法错误的核心原因是:

  • RouteBuilder.configure() 方法是路由初始化阶段执行的,此时还没有任何请求消息进入路由,你写的 .to("rest:get:" + endpoint + "/" + id) 字符串拼接逻辑会在初始化阶段就执行完成,拼接的是类变量id的默认值null,后续运行时处理消息时修改id类变量不会改变已经初始化完成的静态端点地址。
  • 类变量是整个路由实例共享的,多并发请求场景下会出现线程安全问题,完全不适合存储单条请求的上下文数据。

正确解决方案

Camel提供了toD(动态收件人端点)组件,专门用于运行时动态计算目标端点地址,支持通过simple表达式直接读取Exchange的Body、Header等上下文数据,不需要额外定义类变量和处理器赋值。

修改后的代码如下:

public class SomeRoute extends RouteBuilder {

    @ConfigProperty(name = "rest.external.host")
    String host;

    @ConfigProperty(name = "rest.external.endpoint")
    String endpoint;

    @Override
    public void configure() throws Exception {
        restConfiguration().host(host);

        from("direct:routeEntry")
                .log(LoggingLevel.INFO, log, body().toString())
                .setHeader(Exchange.HTTP_METHOD, constant("GET"))
                .removeHeader(Exchange.HTTP_PATH)
                .removeHeaders("Camel*")
                // 不需要自定义处理器赋值类变量,直接用toD动态拼接端点
                .toD("rest:get:" + endpoint + "/${body}")
                .convertBodyTo(String.class);
       }
    }

如果你的Body里包含复杂内容,也可以先将需要的id提取出来存到消息头,再在toD中读取头字段:

from("direct:routeEntry")
    // 前序逻辑省略
    .setHeader("requestId", body())
    .toD("rest:get:" + endpoint + "/${header.requestId}")
    // 后续逻辑省略

说明

simple表达式里的${body}会自动读取当前Exchange的In消息Body内容,toD会在每条消息处理时动态计算端点地址,完全符合动态拼接REST路径的需求,同时规避了类变量的线程安全问题。

内容的提问来源于stack exchange,提问作者PowerfullDeveloper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:45:02