春季@ConditionalOnProperty值 = “value1” 或 “value2”

2022-09-01 20:22:53

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

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

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

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

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


答案 1

Spring Boot 为创建的 AnyNestedCondition 提供了一个条件,当任何嵌套条件匹配时,该条件将匹配。它还提供 AllNestedConditionsNoneNestedConditions,以便在所有嵌套条件或没有嵌套条件分别匹配时进行匹配。

对于要匹配的值的特定情况,或者您可以创建如下值:value1value2AnyNestedCondition

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 所示,嵌套条件可以是任何类型。它们不需要都属于与在此特定情况下相同的类型。


答案 2

注释和两者都没有注释,因此您无法仅添加多个注释来检查多个属性。@ConditionalOnProperty@ConditionalOnExpressionjava.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}")

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

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


推荐