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
并通过 @EnableConfigurationProperties
在 TargetConfiguration
中注册它,那么它将是通常填充,但是对于 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
。这意味着 someOtherBeanUser
和 beanUser
很早就被注入了。
配置绑定的工作方式是通过 ConfigurationPropertiesBindingPostProcessor
。通过触发早期初始化,您将强制 Spring 在 ConfigurationPropertiesBindingPostProcessor
注册之前创建 beanUser
。这意味着不能应用任何绑定。
一个完整的示例应用程序将有助于确定您的属性未被绑定的原因,但我相信将 @EnableConfigurationProperties
添加到 TargetConfiguration
或测试 class 本身将修复它。
大家晚上好。我有一个 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
并通过 @EnableConfigurationProperties
在 TargetConfiguration
中注册它,那么它将是通常填充,但是对于 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
。这意味着 someOtherBeanUser
和 beanUser
很早就被注入了。
配置绑定的工作方式是通过 ConfigurationPropertiesBindingPostProcessor
。通过触发早期初始化,您将强制 Spring 在 ConfigurationPropertiesBindingPostProcessor
注册之前创建 beanUser
。这意味着不能应用任何绑定。
一个完整的示例应用程序将有助于确定您的属性未被绑定的原因,但我相信将 @EnableConfigurationProperties
添加到 TargetConfiguration
或测试 class 本身将修复它。