2016-09-16 28 views
1

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

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

回答

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

谢谢@哈森!第一个建议帮助我意识到属性'route1.db'不存在。虽然这只是修复的一部分,但我会接受这个答案。 –

1

Unexpected token. Expected 'colon(:)' but was 'lcurly({)'原因是,有存在于属性文件没有属性route1.db,因此表达评价为headers['DATA'].routingKey == 'ROUTE1' ? ${route1.db} : some-alternative-db,留下${route1.db}不变。这导致语法错误。

此外,@哈森建议把单引号,这是需要呈现属性文件中的值作为适当的字符串。如果没有它,评估表达式headers['DATA'].routingKey == 'ROUTE1' ? direct-db : some-alternative-db将把direct-dbsome-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'