如何在路由中使用$ header

时间:2016-04-19 19:13:54

标签: apache-camel

我在Camel中使用Java DSL创建路由。

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

我有这个:

.setHeader(MY_THING,
    constant(my_template.replace("{id1}", simple("${header.subs_val}").getText())))

如果我不添加常数'我得到类型不匹配错误。如果我不将getText()放在simple()部分,我会得到文本不匹配的答案。当我运行我的路线时,它会用文字{id}替换${header.subs_val},而不是从标题中获取我的值。然而,如果我取消引号,我会收到编译错误;当然,Java并不知道${...}语法。

部署需要几分钟,因此实验费用很高。

那么,我怎样才能做一个简单的替换。我在网上找到的任何东西实际上似乎都没有用。

编辑 - 模板是什么?具体来说,是一个字符串(它是一个URL)

http://this/that/{id1}/another/thing

我已经继承了一些代码,因此我无法简单to(...)这个网址并应用特殊的.tof()(??)格式。

1 个答案:

答案 0 :(得分:2)

有趣的案例!

如果将my_template放在标题中,则可以使用嵌套的简单表达式(Camel 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()})}"))

在此步骤之后,标题MY_THING的值为http://this/that/22/another/thing

1)在这个例子中,我可以跳过to_String(),但我不知道你的标题“subs_val”的类型是什么。

2)我首先尝试使用replaceAll(\“\ {id1 \”} \“),但它不起作用}可能这是一个错误...会再看一遍。这就是为什么在我的正则表达式中我用过。?

3)当您在处理器内调试应用程序时,交换机可用,您可以使用SimpleBuilder在IDE中轻松评估简单表达式,而无需重新启动应用程序

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

希望它有所帮助:)