Spring Boot Test @ConfigurationProperties не связывает поля - PullRequest
1 голос
/ 26 мая 2020

Всем добрый вечер. У меня есть класс, предназначенный для привязки к свойствам. В классе с меткой @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 и зарегистрирую его через @EnableConfigurationProperties в TargetConfiguration, то оно будет нормально заполнено, но для BeanProperties I не может этого сделать, поскольку этот компонент зависит от свойства в test.properties . Также, если я создам этот bean-компонент с помощью конфигурации @TestConfiguration, он будет заполнен до ...

Любая помощь приветствуется.

UPD-1: первое предположение - я регистрирую некий класс, который расширяет BeanDefinitionRegistryPostProcessor аннотацией @DependsOn с именем RegistratorClass. Я не знаю почему, но если я добавлю @DependsOn в класс RegistratorClass, мой BeanProperties будет немедленно построен без привязки (и перейдя к другому методу, который хочет получить это BeanProperties). Если я удалю эту аннотацию, RegistratorClass инициализирует первую, а моя BeanProperties будет нормально построена и привязана к свойствам.

1 Ответ

1 голос
/ 27 мая 2020

A BeanDefinitionRegistryPostProcessor инициализируется на ранней стадии жизненного цикла и предназначен для использования для добавления дополнительных определений bean-компонентов. В примере кода, который вы разместили на https://github.com/spring-projects/spring-boot/issues/21584, вы заявляете, что beanGenerator зависит от someOtherBeanUser. В свою очередь, someOtherBeanUser вводит beanUser. Это означает, что someOtherBeanUser и beanUser вводятся очень рано.

Привязка конфигурации работает через ConfigurationPropertiesBindingPostProcessor. Запуская раннюю инициализацию, вы заставляете Spring создать beanUser до того, как ConfigurationPropertiesBindingPostProcessor будет зарегистрирован. Это означает, что привязка не может быть применена.

Полный пример приложения поможет определить, почему ваши свойства не привязаны, но я считаю, что добавление @EnableConfigurationProperties к TargetConfiguration или сам тестовый класс исправит это .

...