Spring 启动测试@ConfigurationProperties 不绑定字段

Spring Boot Test @ConfigurationProperties does not bind fields

大家晚上好。我有一个 class 是为绑定属性而设计的。在标记为 @Configuration 的 class 中,我将这个 bean 对象设为:

// Into TargetConfiguration class

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

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

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

问题是 BeanProperties 将包含空字段,但如果我制作其他 OtherBeanProperties 并通过 @EnableConfigurationPropertiesTargetConfiguration 中注册它,那么它将是通常填充,但是对于 BeanProperties 我不能这样做,因为这个 bean 依赖于 test.properties 中的 属性。另外,如果我通过 @TestConfiguration 配置创建这个 bean,那么它将填充到...

感谢任何帮助。

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

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

配置绑定的工作方式是通过 ConfigurationPropertiesBindingPostProcessor。通过触发早期初始化,您将强制 Spring 在 ConfigurationPropertiesBindingPostProcessor 注册之前创建 beanUser。这意味着不能应用任何绑定。

一个完整的示例应用程序将有助于确定您的属性未被绑定的原因,但我相信将 @EnableConfigurationProperties 添加到 TargetConfiguration 或测试 class 本身将修复它。