一尘不染

在@Configuration bean中的SpEL表达式中引用ConfigurationProperties Bean

spring-boot

我有这个属性类:

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,但这也不起作用。


阅读 422

收藏
2020-05-30

共1个答案

一尘不染

我认为您面临的问题是在解析类@Conditions时对它们进行评估@Configuration,因此不能保证SomeProperties已定义了bean。即使已定义它,您也可能不希望它提早初始化,因此我建议使用其他方法。

您可以尝试一下@ConditionalOnPropety,这是Spring
Boot在有条件地希望基于属性启用自动配置时在内部使用的注释。如果不够灵活,则可以创建自己的ConditionEnvironment直接访问,以判断属性值是否为空。如果要支持灵活绑定,可以使用RelaxedPropertyResolver这是一个例子

2020-05-30