Spring Boot SpEL ConditionalOnExpression 检查多个属性

新手上路,请多包涵

问题:

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

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

例子

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

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

类似问题的答案: How to check two condition while using @ConditionalOnProperty or @ConditionalOnExpression concatenates two strings together and performs a check like so:

级联解决方案

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

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

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

原文由 anataliocs 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

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

原文由 anataliocs 发布,翻译遵循 CC BY-SA 3.0 许可协议

据我记得,你可以使用这种表达方式:

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

进一步阅读这里是 链接

如果有帮助,请发表评论,这样我的困惑也可能会被清除。

原文由 Tahir Hussain Mir 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题