Spring Boot SpEL ConditionalOnExpression 检查多个属性

2022-09-03 18:15:03

问题:

如何使用Spring表达式语言来检查2个布尔属性是否为真?

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

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

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

类似问题的答案:如何在使用@ConditionalOnProperty或@ConditionalOnExpression时检查两个条件将两个字符串连接在一起并执行如下检查:

串联解决方案

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

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

注意:同样需要明确的是,答案不是您可以从我所看到的内容中轻松搜索到的。这似乎是一个非常简单的答案,但事实证明它是相当难以捉摸的。


答案 1

注释和两者都没有注释,因此您无法仅添加多个注释来检查多个属性。@ConditionalOnProperty@ConditionalOnExpressionjava.lang.annotation.Repeatable

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

两个属性的解决方案

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

请注意以下几点:

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

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

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

多个属性的解决方案

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

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


答案 2

据我所知,你可以用这种表达方式:

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

进一步阅读这里是链接

如果它有帮助,请发表评论,以便我的困惑也可以得到解决。


推荐