Как проверить два условия при использовании @ConditionalOnProperty или @ConditionalOnExpression

Мне нужно проверить, что два условия выполняются в файле свойств YAML при создании bean-компонента. Как мне это сделать, поскольку аннотация @ConditionalOnProperty поддерживает только одно свойство?


person Zenith Kenneth    schedule 15.03.2016    source источник
comment
Возможный дубликат Spring Boot SpEL ConditionalOnExpression проверяет несколько свойств   -  person Piran    schedule 04.05.2018


Ответы (4)


Так как с начала @ConditionalOnProperty можно было проверить более одного свойства. Атрибут name/value представляет собой массив.

@Configuration
@ConditionalOnProperty({ "property1", "property2" })
protected static class MultiplePropertiesRequiredConfiguration {

    @Bean
    public String foo() {
        return "foo";
    }

}

Для простых логических свойств с проверкой И вам не нужен @ConditionalOnExpression.

person Josh    schedule 23.08.2017
comment
Это тривиальный случай, и он не будет работать, если вам нужны property1=x и property1=y . - person Abhijit Sarkar; 05.03.2021

Используйте аннотацию @ConditionalOnExpression и выражение SpEL, как описано здесь http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html.

Пример:

@Controller
@ConditionalOnExpression("${controller.enabled} and ${some.value} > 10")
public class WebController {
person Navrocky    schedule 06.10.2016

Вас может заинтересовать AllNestedConditions абстрактный класс, представленный в Spring Boot 1.3.0. Это позволяет вам создавать составные условия, в которых все определенные вами условия должны применяться до того, как любой @Bean будет инициализирован вашим @Configuration классом.

public class ThisPropertyAndThatProperty extends AllNestedConditions {

    @ConditionalOnProperty("this.property")
    @Bean
    public ThisPropertyBean thisProperty() {
    }

    @ConditionalOnProperty("that.property")
    @Bean
    public ThatPropertyBean thatProperty() {
    }

}

Затем вы можете аннотировать свой @Configuration следующим образом:

@Conditional({ThisPropertyAndThatProperty.class}
@Configuration
person Patrick Grimard    schedule 15.03.2016
comment
AllNestedCondition не имеет конструктора без аргументов. Вам нужно вызвать суперконструктор из конструктора ThisPropertyAndThatProperty, например super(ConfigurationPhase.PARSE_CONFIGURATION). - person Abhijit Sarkar; 05.03.2021

Проблема решена путем совместного использования @ConditionalOnExpression для двух свойств.

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

При этом значение свойства в конфигурации указано ниже.

Свойство 1 Имя — com.property1 Значение — value1

Свойство 2 Имя — com.property2 Значение — value2

person Zenith Kenneth    schedule 15.03.2016
comment
А как насчет "${com.property1}=='value1' and ${com.property2}=='value2'" ? - person Navrocky; 06.10.2016
comment
встречный пример: com.property = value и com.property2 = 1value2 делают выражение == истинным, но это не то, что ищет ОП. 95% кода приложений по всему миру отстой из-за такого рода уродливых хаков, которые приносят только неприятности. Как сказал @Navrocky, правильным решением будет "${com.property1}=='value1' and ${com.property2}=='value2'" - person Clint Eastwood; 09.04.2018