Apache camel 如何在路由中使用$header

Apache camel 如何在路由中使用$header,apache-camel,Apache Camel,我正在使用Camel中的javadsl创建一个路由 我希望在不创建新处理器或bean的情况下执行文本替换 我有这个: .setHeader(MY_THING, constant(my_template.replace("{id1}", simple("${header.subs_val}").getText()))) 如果不添加“常量”,则会出现类型不匹配错误。如果我不将getText()放在simple()部分,就会得到文本不匹配的答案。当我运行我的路由时,它将{id}替换为lite

我正在使用Camel中的javadsl创建一个路由

我希望在不创建新处理器或bean的情况下执行文本替换

我有这个:

.setHeader(MY_THING,
    constant(my_template.replace("{id1}", simple("${header.subs_val}").getText())))
如果不添加“常量”,则会出现类型不匹配错误。如果我不将getText()放在simple()部分,就会得到文本不匹配的答案。当我运行我的路由时,它将
{id}
替换为literal
${header.subs_val}
,而不是从header获取我的值。然而,如果我去掉引号,我会得到编译错误;Java当然不知道
${…}
语法

部署需要几分钟,因此实验费用昂贵

那么,我如何做一个简单的替换呢。我在网上发现的东西似乎都不管用

编辑-模板是什么?特别是字符串(它是URL)

我继承了一些代码,因此我无法简单地
到(…)
URL并应用特殊的
.tof()
(?)格式。

有趣的案例

如果将my_模板放在标题中,则可以使用嵌套的简单表达式(驼峰2.9版以后),如下面的示例所示。在本例中,我还将一个值设置为subs_val,但我假设您的头在路由中已经有一个值

  .setHeader("my_template", constant("http://this/that/{id1}/another/thing"))
  .setHeader("subs_val",constant("22"))
  .setHeader("MY_THING",simple("${in.header.my_template.replaceAll(\"\\{id1.?\",${in.header.subs_val.toString()})}"))
在这一步之后,我的东西有了值

1) 在本例中,我可以跳到_String(),但我不知道标题“subs_val”的类型

2) 我先用replaceAll(\“{id1\“}\”)试过了,但在}上不起作用。可能这是一个bug…我会再看一遍。这就是我在正则表达式中使用的原因

3) 当您在可使用exchange的处理器中调试应用程序时,您可以使用SimpleBuilder在IDE中轻松计算简单表达式,而无需重新启动应用程序

 SimpleBuilder.simple("${in.header.url.replaceAll(\"\\{id1.?\",${in.header.subs_val.toString()})}").evaluate(exchange, String.class);

希望对您有所帮助:)

在您的示例中,my_模板是什么?my_模板与exchange的关系如何?如果您愿意提供更多详细信息,我将尝试复制此案例。我知道您希望将模板中名为id的参数替换为header.subs_val的内容,但我无法确定模板是什么。@ltsallas Edits madeso my_模板不在exchange内部的标头或属性中?它在路由中硬编码?@ltsallas这是正确的。结果放在标头中,替换值来自exchange。谢谢。虽然没有理由将模板放在标头中,但也不会影响任何内容。您的替换上面的ion比使用处理器的实现要干净得多,这就是我最后要做的。我刚刚读了你关于注入模板的最新评论。Simple language提供了一系列不同的选项来读取值(外部属性、bean等)请参阅中的变量。可能其中一个选项更干净。如果您喜欢添加部分路线(尤其是此模板注入部分)因此,我们可以找出其他可用的简单表达式值之一是否有助于避免Exchange标头中的此设置。我可以看出,这将更加干净。我们最终实现了与上面所述几乎完全相同的功能。很好…关于我在要点(2)中提到的正则表达式,我打开了一张jira罚单,骆驼2.18版的罚单已经被修改了。所以它可能会变得更严格,看到了吗
 SimpleBuilder.simple("${in.header.url.replaceAll(\"\\{id1.?\",${in.header.subs_val.toString()})}").evaluate(exchange, String.class);