Мне нужно проверить, что два условия выполняются в файле свойств YAML при создании bean-компонента. Как мне это сделать, поскольку аннотация @ConditionalOnProperty
поддерживает только одно свойство?
Как проверить два условия при использовании @ConditionalOnProperty или @ConditionalOnExpression
Ответы (4)
Так как с начала @ConditionalOnProperty
можно было проверить более одного свойства. Атрибут name/value представляет собой массив.
@Configuration
@ConditionalOnProperty({ "property1", "property2" })
protected static class MultiplePropertiesRequiredConfiguration {
@Bean
public String foo() {
return "foo";
}
}
Для простых логических свойств с проверкой И вам не нужен @ConditionalOnExpression
.
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 {
Вас может заинтересовать 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
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
"${com.property1}=='value1' and ${com.property2}=='value2'"
?
- person Navrocky; 06.10.2016
com.property = value
и com.property2 = 1value2
делают выражение == истинным, но это не то, что ищет ОП. 95% кода приложений по всему миру отстой из-за такого рода уродливых хаков, которые приносят только неприятности. Как сказал @Navrocky, правильным решением будет "${com.property1}=='value1' and ${com.property2}=='value2'"
- person Clint Eastwood; 09.04.2018