有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring Boot SpEL ConditionalOnExpression检查多个属性

问题:

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

例如,检查单个属性是否为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'")

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

注意: 同样要明确的是,答案并不是你能从我的所见所闻中轻易找到的。这似乎是一个非常简单的答案,但事实证明它相当难以捉摸


共 (2) 个答案

  1. # 1 楼答案

    据我记忆所及, 你可以用这样的表达:

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

    供进一步阅读 这是link

    如果有帮助,请发表评论,这样我的困惑也会得到澄清

  2. # 2 楼答案

    注释@ConditionalOnProperty@ConditionalOnExpression都没有java.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}")
    

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