Spring @ConditionalOnProperty havingValue = "value1" 或 "value2"

新手上路,请多包涵

我正在寻找 configurationOnProperty 可以指定考虑多个值的用法,如下所示

例如: @ConditionalOnProperty(value = "test.configname", havingValue = "value1" or "value2")

或者

我想知道是否可以指定 confiugrationOnProperty 条件为 havingValue != "value3"

例如: @ConditionalOnProperty(value = "test.configname", havingValue != "value3")

如果有办法在 spring boot 配置中实现上述任何一项,请告诉我。

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

阅读 3.3k
2 个回答

Spring Boot 提供 AnyNestedCondition 用于创建一个条件,该条件将在任何嵌套条件匹配时匹配。它还提供 AllNestedConditionsNoneNestedConditions 用于匹配所有嵌套条件或不匹配嵌套条件时。

对于您想要匹配值 value1value2 的特定情况,您将创建一个 AnyNestedCondition ,如下所示:

 class ConfigNameCondition extends AnyNestedCondition {

    public ConfigNameCondition() {
        super(ConfigurationPhase.PARSE_CONFIGURATION);
    }

    @ConditionalOnProperty(name = "test.configname", havingValue = "value1")
    static class Value1Condition {

    }

    @ConditionalOnProperty(name = "test.configname", havingValue = "value2")
    static class Value2Condition {

    }

}

然后将它与 @Conditional 一起使用,例如:

 @Bean
@Conditional(ConfigNameCondition.class)
public SomeBean someBean() {
    return new SomeBean();
}

如嵌套条件注释的 javadoc 中所示(链接到上面),嵌套条件可以是任何类型。在这种特殊情况下,它们不需要都属于同一类型。

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

注释 @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 文件中/环境或仅依赖默认值

取自这里 Spring Boot SpEL ConditionalOnExpression 检查多个属性

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

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