题:
如何使用Spring Expression Language检查2个布尔属性是否正确?
例如,检查单个属性为true将使用以下语法:
例
@ConditionalOnExpression("${property.from.properties.file}")
检查的语法是property1 == true && property2 == false什么?这些属性可能具有不同的值。
property1 == true && property2 == false
相似问题的答案:如何在使用@ConditionalOnProperty或@ConditionalOnExpression时检查两个条件,将两个字符串连接在一起并执行如下检查:
串联解决方案
@ConditionalOnExpression("'${com.property1}${com.property2}'=='value1value2'")
对于阅读该代码的人来说,这种语法似乎令人困惑,而且似乎是一个棘手的解决方案。在某些极端情况下,解决方案也会失败。我想找到一种无需连接值即可检查两个单独属性的正确方法。
注意: 还要清楚一点,答案并不是您可以从我所看到的内容中轻松找到的答案。 看来这将是一个非常简单的答案,但事实证明它相当难以捉摸。
注释@ConditionalOnProperty和注释@ConditionalOnExpression都没有java.lang.annotation.Repeatable注释,因此您将不能仅添加多个注释来检查多个属性。
@ConditionalOnProperty
@ConditionalOnExpression
java.lang.annotation.Repeatable
以下语法已经过测试并可以工作:
两种属性的解决方案
@ConditionalOnExpression("${properties.first.property.enable:true} && ${properties.second.property.startServer:false}")
请注意以下几点:
它允许具有不同值的多个属性,并且可以扩展到多个属性。
如果要检查两个以上的值并仍保持可读性,则可以在要评估的不同条件之间使用串联运算符:
超过2个属性的解决方案
@ConditionalOnExpression("${properties.first.property.enable:true} " + "&& ${properties.second.property.enable:true} " + "&& ${properties.third.property.enable:true}")
缺点是您不能像使用批注时那样使用matchIfMissing参数,@ConditionalOnProperty因此必须确保所有配置文件/环境的属性都存在于 .properties 或 YAML 文件中,或者仅依赖默认值值