问题:
我如何使用 Spring 表达式语言检查 2 个 boolean 属性是否为真?
例如,检查单个属性是否为真将使用语法:
示例
@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 解决方案。在某些边缘情况下,解决方案也会失败。 我想找到正确的方法来检查两个单独的属性而不连接值。
注意: 另外需要说明的是,根据我所见,您无法轻易找到答案。这似乎是一个非常简单的答案,但事实证明它相当难以捉摸。
最佳答案
注释 @ConditionalOnProperty 和 @ConditionalOnExpression 都没有 java.lang.annotation.Repeatable 注释,所以你不能只需添加多个注释来检查多个属性。
以下语法已经过测试并有效:
两个属性的解决方案
@ConditionalOnExpression("${properties.first.property.enable:true} && ${properties.second.property.startServer:false}")
注意以下几点:
它允许具有不同值的多个属性,并且可以扩展到多个属性。
如果您想检查超过 2 个值并仍然保持可读性,您可以在您正在评估的不同条件之间使用串联运算符:
超过 2 个属性的解决方案
@ConditionalOnExpression("${properties.first.property.enable:true} " +
"&& ${properties.second.property.enable:true} " +
"&& ${properties.third.property.enable:true}")
缺点是您不能像使用 @ConditionalOnProperty 注释时那样使用 matchIfMissing 参数,因此您必须确保属性存在于 .properties 中 或 YAML 文件用于所有配置文件/环境,或仅依赖默认值
关于java - Spring Boot SpEL ConditionalOnExpression 检查多个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40477251/