Apache Camel 3.18.3中HTTP_PATH头在toD组件中失效求助
问题描述
我尝试使用Camel toD EIP文档中的示例代码:
from("direct:login") .setHeader(Exchange.HTTP_PATH, simple("/login")) .setHeader(Exchange.HTTP_QUERY, simple("userid=${header.userName}")) .toD("http:myloginserver:8080") .removeHeader(Exchange.HTTP_PATH) .removeHeader(Exchange.HTTP_QUERY);
但Exchange.HTTP_PATH头未被使用,实际调用的URL为http://myloginserver:8080?userid=xxx,而非预期的http://myloginserver:8080/login?userid=xxx。
调试后发现问题出在org.apache.camel.http.base.HttpSendDynamicAware类的createPreProcessor方法第96行,该方法解析toD的URL时路径为空,未检查Exchange.HTTP_PATH是否已设置。
我是从Camel 3.11.x升级而来,旧版本无该类且功能正常,请问有没有无需修改代码的解决办法?
无需修改代码的解决办法
- 直接在toD的URL中拼接路径:把
Exchange.HTTP_PATH的内容直接整合到toD的目标地址里,修改后的代码如下:
from("direct:login") .setHeader(Exchange.HTTP_QUERY, simple("userid=${header.userName}")) .toD("http:myloginserver:8080${header.HTTP_PATH}") .removeHeader(Exchange.HTTP_PATH) .removeHeader(Exchange.HTTP_QUERY);
这种方式绕开了HttpSendDynamicAware对路径头的忽略问题,直接通过动态表达式把路径拼接到基础URL上,和旧版本的行为一致。
- 禁用HttpSendDynamicAware组件:在Camel配置中添加以下配置,禁用这个动态感知类,让HTTP组件回到旧版本的处理逻辑:
- 配置文件方式(properties格式):
camel.component.http.send-dynamic-aware-enabled=false- Java代码配置方式:
该配置会关闭HttpComponent httpComponent = context.getComponent("http", HttpComponent.class); httpComponent.setSendDynamicAwareEnabled(false);HttpSendDynamicAware的作用,恢复3.11.x版本中对Exchange.HTTP_PATH头的处理逻辑。
内容的提问来源于stack exchange,提问作者landal79
相关产品推荐
相关产品推荐

