Spring 使用属性集成条件 SpEL

Spring Integration Conditional SpEL using Properties

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

<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({)'。也许我错过了什么。

尝试

<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>

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-dbsome-alternative-db 都视为 Spring fields/properties,它们甚至是错误命名的变量开头。

最终的有效形式应该是:

<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'