春季启动规划环境地政司ConditionalOnExpression检查多个属性

问题描述 投票:8回答:2

题:

我如何使用Spring表达式语言来检查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'")

这句法显得扑朔迷离的人读取代码,它似乎是一个哈克的解决方案。还有一些边缘情况下的解决方案也将失败。我想找到合适的方法来检查两个独立的属性,而无需串接值。

注:也仅仅是明确的,答案是不是你可以轻松地从我所看到的搜索。看起来这将是一个非常简单的答案,但它证明是相当渺茫。

java spring spring-boot spring-el
2个回答
18
投票

注释@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}")

缺点是你不能使用matchIfMissing参数,你将能够使用@ConditionalOnProperty注释时,所以你必须确保属性存在于的.properties或YAML文件,为您的所有配置文件/环境或者仅仅依靠默认值


4
投票

至于我记得,你可以使用这种表达:

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

进一步阅读下面是link

如果它是有帮助的,请你评论,使我的困惑也可能会被清除。

© www.soinside.com 2019 - 2024. All rights reserved.