问题
I need to check that two conditions are satisfied on a YAML property file, while creating a bean. How do I do that, as the @ConditionalOnProperty
annotation supports only one property?
回答1:
Use @ConditionalOnExpression
annotation and SpEL expression as described here http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html.
Example:
@Controller
@ConditionalOnExpression("${controller.enabled} and ${some.value} > 10")
public class WebController {
回答2:
Since from the beginning of @ConditionalOnProperty
it was possible to check more than one property. The name / value attribute is an array.
@Configuration
@ConditionalOnProperty({ "property1", "property2" })
protected static class MultiplePropertiesRequiredConfiguration {
@Bean
public String foo() {
return "foo";
}
}
For simple boolean properties with an AND check you don't need a @ConditionalOnExpression
.
回答3:
You might be interested in the AllNestedConditions abstract class that was introduced in Spring Boot 1.3.0. This allows you to create composite conditions where all conditions you define must apply before any @Bean
are initialized by your @Configuration
class.
public class ThisPropertyAndThatProperty extends AllNestedConditions {
@ConditionalOnProperty("this.property")
@Bean
public ThisPropertyBean thisProperty() {
}
@ConditionalOnProperty("that.property")
@Bean
public ThatPropertyBean thatProperty() {
}
}
Then you can annotate your @Configuration
like this:
@Conditional({ThisPropertyAndThatProperty.class}
@Configuration
回答4:
Resolved the issue by using @ConditionalOnExpression for the two properties together.
@ConditionalOnExpression("'${com.property1}${com.property2}'=='value1value2'")
Wherein property value in configuration is as below.
Property 1
Name - com.property1
Value - value1
Property 2
Name - com.property2
Value - value2
来源:https://stackoverflow.com/questions/36016864/how-to-check-two-condition-while-using-conditionalonproperty-or-conditionalone