Spring @ConditionalOnProperty具有Value =“ value1”或“ value2”

时间:2018-07-10 04:47:38

标签: java spring spring-boot javabeans

我正在寻找'<id>'的用法,可以在其中指定考虑多个值,如下所示

例如:configurationOnProperty

OR

我想知道是否可以以@ConditionalOnProperty(value = "test.configname", havingValue = "value1" or "value2")为条件指定confiugrationOnProperty

例如:havingValue != "value3"

请让我知道是否可以通过@ConditionalOnProperty(value = "test.configname", havingValue != "value3")配置实现以上任一目的。

4 个答案:

答案 0 :(得分:3)

您可以将条件值数组用作:

@Configuration
public class MyConfigClass {

    @Bean
    @ConditionalOnProperty(prefix="test.configname", value = { "value1", "value2" })
    public MyBean myBean() {
        return new MyBean();
    }
}

如果属性test.configname.value1test.configname.value2存在,并且值不为false,则会创建bean。

Spring Boot Document对此有适当的描述。

答案 1 :(得分:3)

注释@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参数,因此必须确保属性出现在 .properties 中。或 YAML 文件用于您的所有配置文件/环境,或仅依赖默认值

从这里Spring Boot SpEL ConditionalOnExpression check multiple properties

答案 2 :(得分:3)

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

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

class ConfigNameCondition extends AnyNestedCondition {

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

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

    }

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

    }

}

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

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

如嵌套条件注释的Javadoc中所示(链接到上面),嵌套条件可以是任何类型。在这种情况下,它们不必都具有相同的类型。

答案 3 :(得分:1)

  

我正在寻找configurationOnProperty的用法,可以在其中指定   考虑多个值

您可以使用Spring 4.0中的Condition interface

此接口具有您可以使用的方法matches(...)

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class TestCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String testValue = (context.getEnvironment().getProperty("test.configname");
        return "value1".equalsIgnoreCase("testValue") || "value2".equalsIgnoreCase("testValue");
    }

}

然后在TestCondition内使用@Configuration,如下所示:

@Configuration
public class TestConfig {

      @Conditional(value=TestCondition .class)
      public MyBean getTestConfigBean() {
          //TODO YOUR CODE;
      }

}
  

我想知道是否可以指定   confiugrationOnProperty,具有havingValue!=“ value3”

public class TestCondition2 implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String testValue = (context.getEnvironment().getProperty("test.configname");
        return ! "value3".equalsIgnoreCase("testValue");
    }

}

然后像这样使用它:

@Configuration
public class TestConfig {

      @Conditional(value=TestCondition2 .class)
      public MyBean getTestConfigBean() {
          //TODO YOUR CODE;
      }

}