我有这个属性类:
import java.util.List; import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties("some") public class SomeProperties { private List<String> stuff; public List<String> getStuff() { return stuff; } public void setStuff(List<String> stuff) { this.stuff = stuff; } }
并且我在@Configuration类中启用配置属性,如下所示:
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration @EnableConfigurationProperties(SomeProperties.class) public class SomeAutoConfiguration { }
在同一个类(“ SomeAutoConfiguration”)中,我想创建另一个bean,具体取决于SomeProperties中的list属性是否为空。我以为我可以将@ConditionalExpression与以下SpEl结合使用:
@Bean @ConditionalOnExpression("!(#someProperties.stuff?.isEmpty()?:true)") public Object someBean(final SomeProperties someProperties) { return new Object(); }
SpEl是正确的,但我无法控制包含我的属性的bean。使用上面的表达式我碰到
EL1007E :(位置43):在null上找不到属性或字段’stuff’
并尝试通过其名称来获得bean,例如
@Bean @ConditionalOnExpression("!(@'some.CONFIGURATION_PROPERTIES'.stuff?.isEmpty()?:true)") public Object someBean(final SomeProperties someProperties) { return new Object(); }
结束于
NoSuchBeanDefinitionException:未定义名为“ some.CONFIGURATION_PROPERTIES”的Bean
有任何想法吗?我已经尝试过在另一个类中启用ConfigurationProperties,但这也不起作用。
我认为您面临的问题是在解析类@Conditions时对它们进行评估@Configuration,因此不能保证SomeProperties已定义了bean。即使已定义它,您也可能不希望它提早初始化,因此我建议使用其他方法。
@Conditions
@Configuration
SomeProperties
您可以尝试一下@ConditionalOnPropety,这是Spring Boot在有条件地希望基于属性启用自动配置时在内部使用的注释。如果不够灵活,则可以创建自己的Condition并Environment直接访问,以判断属性值是否为空。如果要支持灵活绑定,可以使用RelaxedPropertyResolver。这是一个例子。
@ConditionalOnPropety
Condition
Environment
RelaxedPropertyResolver