Spring Boot SpEL ConditionalOnExpression检查多个属性

时间:2016-11-08 00:55:38

标签: java spring spring-boot spring-el

问题:

如何使用Spring Expression Language检查2个布尔属性是否为真?

例如,检查单个属性是否为true将使用以下语法:

示例

@ConditionalOnExpression("${property.from.properties.file}")

检查property1 == true && property2 == false的语法是什么?属性可能具有不同的值。

来自类似问题的答案:How to check two condition while using @ConditionalOnProperty or @ConditionalOnExpression将两个字符串连接在一起并执行检查,如下所示:

连接解决方​​案

@ConditionalOnExpression("'${com.property1}${com.property2}'=='value1value2'")

对于那些阅读该代码的人而言,这种语法似乎令人困惑,这似乎是一个hacky解决方案。有一些边缘情况解决方案也会失败。 我想找到检查两个单独属性而不连接值的正确方法。

注意: 另外,为了清楚起见,答案并不是你可以从我所看到的内容中轻松搜索到的。这似乎是一个非常简单的答案,但它证明是相当难以捉摸的。

2 个答案:

答案 0 :(得分:16)

注释@ConditionalOnProperty@ConditionalOnExpression都没有java.lang.annotation.Repeatable注释,因此您无法只添加多个注释来检查多个属性。

以下语法已经过测试并且有效:

两个属性的解决方案

@ConditionalOnExpression("${properties.first.property.enable:true} && ${properties.second.property.startServer:false}")

请注意以下事项:

  • 您需要使用冒号表示来指示默认值 表达式语言语句中的属性
  • 每个属性都使用单独的表达式语言块$ {}
  • &&运算符在SpEL块之外使用

它允许具有不同值的多个属性,并且可以扩展到多个属性。

如果要检查多于2个值并仍然保持可读性,可以在正在评估的不同条件之间使用串联运算符:

超过2个属性的解决方案

@ConditionalOnExpression("${properties.first.property.enable:true} " +
        "&& ${properties.second.property.enable:true} " +
        "&& ${properties.third.property.enable:true}")

缺点是您不能像使用@ConditionalOnProperty注释那样使用matchIfMissing参数,因此您必须确保 .properties 中存在属性或所有配置文件/环境的 YAML 文件或仅依赖默认值

答案 1 :(得分:3)

据我记得, 你可以使用这种表达方式:

@ConditionalOnExpression("'${com.property1}'.equals('${com.property2}')")

进一步阅读 这是link

如果它有用,请发表评论,以便我的混淆也可能被清除。