1

expression有没有办法在Spring 字段的三元表达式中使用 spring 属性header-enricher?看起来像这样的东西:

<int:header-enricher>
    <int:header name="DESTINATION" expression="headers['DATA'].routingKey == 'ROUTE1' ? ${route1.db} : ${route2.db}"/>
</int:header-enricher>

这导致了一个错误的说法Unexpected token. Expected 'colon(:)' but was 'lcurly({)'。也许我错过了什么。

4

2 回答 2

3

尝试

<int:header-enricher>
    <int:header name="DESTINATION" expression="headers['DATA'].routingKey == 'ROUTE1' ? '${route1.db}' : '${route2.db}'"/>
</int:header-enricher>

或者

<int:header-enricher>
    <int:header name="DESTINATION" expression="#{headers['DATA'].routingKey == 'ROUTE1' ? '${route1.db}' : '${route2.db}'}"/>
</int:header-enricher>
于 2016-09-16T08:11:23.640 回答
1

的原因Unexpected token. Expected 'colon(:)' but was 'lcurly({)'是属性文件中不route1.db存在属性,因此表达式被评估为headers['DATA'].routingKey == 'ROUTE1' ? ${route1.db} : some-alternative-db,保持${route1.db}不变。这会导致语法错误。

此外,@Hassen 建议使用将属性文件中的值呈现为正确字符串所需的单引号。没有它,评估的表达式headers['DATA'].routingKey == 'ROUTE1' ? direct-db : some-alternative-db将把direct-db和都some-alternative-db视为 Spring 字段/属性,这些字段/属性甚至是错误命名的变量。

最终的有效表格应该是:

<int:header name="DESTINATION" expression="headers['DATA'].routingKey == 'ROUTE1' ? '${route1.db}' : '${route2.db}'"/>

并假设属性文件包含以下内容:

route1.db=direct-db route2.db=some-alternative-db

评估的表达式将是:

headers['DATA'].routingKey == 'ROUTE1' ? 'direct-db' : 'some-alternative-db'

于 2016-09-16T08:58:29.620 回答