Spring Boot Test @ConfigurationProperties不绑定字段

时间:2020-05-26 18:41:43

标签: java spring spring-boot spring-boot-test

大家晚上好。我有一个用于绑定属性的类。在标记为@Configuration的类中,我将这个bean对象做成:

// Into TargetConfiguration class

@Bean("someBeanName")
@ConfigurationProperties("some.path")
public beanProperties() {
    return new BeanProperties();
}

我想测试此配置的所有功能,为此,我创建了一个测试类,如:

@WebFluxTest
@TestPropertySource("classpath:test.properties")
@ContextConfiguration(classes = {TargetConfiguration.class})
class Test {...}

问题是BeanProperties将包含空字段,但是如果我进行其他操作OtherBeanProperties并通过@EnableConfigurationPropertiesTargetConfiguration中进行注册,则通常会填充,但对于BeanProperties,我无法执行此操作,因为此bean取决于 test.properties 中的属性。另外,如果我通过@TestConfiguration配置创建了这个bean,那么它将被填充到...

感谢您的帮助。

UPD-1:第一个假设-我注册了一个类,该类扩展了BeanDefinitionRegistryPostProcessor并带有名为@DependsOn的{​​{1}}注释。我不知道为什么,但是如果我在RegistratorClass类上添加@DependsOn,我的RegistratorClass会立即构建而没有绑定(并传递给其他想要接收此BeanProperties的方法)。如果我删除此注释,BeanProperties将初始化第一个注释,而我的RegistratorClass将被正常构造并绑定到属性。

1 个答案:

答案 0 :(得分:1)

BeanDefinitionRegistryPostProcessor在生命周期的早期进行了初始化,旨在用于添加其他bean定义。在您发布到https://github.com/spring-projects/spring-boot/issues/21584的示例代码中,您声明beanGenerator取决于someOtherBeanUser。反过来,someOtherBeanUser注入beanUser。这意味着someOtherBeanUserbeanUser很早就被注入了。

配置绑定的工作方式是通过ConfigurationPropertiesBindingPostProcessor。通过触发早期初始化,您迫使Spring在注册beanUser之前创建ConfigurationPropertiesBindingPostProcessor。这意味着无法应用绑定。

完整的示例应用程序将帮助确定为什么不绑定属性,但是我相信将@EnableConfigurationProperties添加到TargetConfiguration或测试类本身会解决该问题。