Apache camel 使用嵌套EL动态读取编号的标头值不再有效 作为一个极小的例子,考虑一个具有一些头值的交换,例如: header.test0 header.test1 header.test2

Apache camel 使用嵌套EL动态读取编号的标头值不再有效 作为一个极小的例子,考虑一个具有一些头值的交换,例如: header.test0 header.test1 header.test2,apache-camel,Apache Camel,我意识到,像这样的编号标题字段并不理想,但这是我无法改变的 在过去(直到Camel 2.17),我能够像这样循环这些值(XML DSL): ${header.myCounter} 但是,由于升级到Camel 2.21,因此会导致以下错误: org.apache.camel.language.simple.types.SimpleAllegalSyntaxException:应为符号函数End,但在位置16 test${header处为eol 声明简单表达式仍然可以嵌套,因此我不确定它为什么停

我意识到,像这样的编号标题字段并不理想,但这是我无法改变的

在过去(直到Camel 2.17),我能够像这样循环这些值(XML DSL):


${header.myCounter}
但是,由于升级到Camel 2.21,因此会导致以下错误:
org.apache.camel.language.simple.types.SimpleAllegalSyntaxException:应为符号函数End,但在位置16 test${header处为eol

声明简单表达式仍然可以嵌套,因此我不确定它为什么停止工作,以及如何解决此问题。我认为我的问题是由于我将静态文本与动态值相结合,而现有示例总是以完整的动态值作为名称


所以我的问题是,动态读取循环中header.test0、header.test1……的值的正确方法是什么?

对于任何有类似问题的人:

问题不在于嵌套表达式。问题在于,如果使用嵌套表达式(如示例中所示)且标头字段不存在,则将引发SimpleAllegalSyntaxexception。在旧版本的Camel中,不存在的标头字段的计算结果将仅为“null”。在较新版本中,将引发异常

假设上面的示例,如果从0到5循环,并且header.test5不存在(例如),将引发异常


空安全“?”在这里没有帮助。“解决方案”是使用a(是的,您可以在XML DSL中这样做),并在“catch”中执行适当的操作如果标题值不存在,则部分删除。这很笨拙,但它允许您在较新的Camel版本中复制路由的原始行为。

您介意发布整个路由配置吗?也许我们可以找到解决方法。
<loop>
   <simple>${header.myCounter}</simple>
   <log message="${header.test${header.CamelLoopIndex}}"/>
</loop>