【问题标题】:Spring Integration Conditional SpEL using Properties使用属性的 Spring 集成条件 SpEL
【发布时间】:2016-09-16 03:24:06
【问题描述】:

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

【问题讨论】:

    标签: java spring-integration spring-el spring-properties


    【解决方案1】:

    试试

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

    【讨论】:

    • 谢谢@Hassen!第一个建议帮助我意识到route1.db 属性不存在。虽然这只是修复的一部分,但我会接受这个作为答案。
    【解决方案2】:

    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 字段/属性,它们甚至是错误命名的变量。

    最终的有效形式应该是:

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

    【讨论】:

      猜你喜欢
      • 2012-03-30
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 2020-12-03
      • 2011-03-05
      • 1970-01-01
      相关资源
      最近更新 更多