Fix binding of bean with no bean definition

See gh-16180
This commit is contained in:
Stephane Nicoll
2019-03-09 20:49:47 +01:00
parent f5eb853f26
commit d07a6ff0bb
2 changed files with 18 additions and 3 deletions

View File

@@ -102,9 +102,13 @@ public class ConfigurationPropertiesBindingPostProcessor implements BeanPostProc
}
private boolean hasBeenBound(String beanName) {
BeanDefinition beanDefinition = ((BeanDefinitionRegistry) this.applicationContext
.getAutowireCapableBeanFactory()).getBeanDefinition(beanName);
return beanDefinition instanceof ConfigurationPropertiesBeanDefinition;
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) this.applicationContext
.getAutowireCapableBeanFactory();
if (registry.containsBeanDefinition(beanName)) {
BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
return beanDefinition instanceof ConfigurationPropertiesBeanDefinition;
}
return false;
}
private void bind(Object bean, String beanName, ConfigurationProperties annotation) {

View File

@@ -846,6 +846,17 @@ public class ConfigurationPropertiesTests {
});
}
@Test
public void loadWhenBindingOnBeanWithoutBeanDefinitionShouldBind() {
load(BasicConfiguration.class, "name=test");
BasicProperties bean = this.context.getBean(BasicProperties.class);
assertThat(bean.name).isEqualTo("test");
bean.name = "override";
this.context.getBean(ConfigurationPropertiesBindingPostProcessor.class)
.postProcessBeforeInitialization(bean, "does-not-exist");
assertThat(bean.name).isEqualTo("test");
}
private AnnotationConfigApplicationContext load(Class<?> configuration,
String... inlinedProperties) {
return load(new Class<?>[] { configuration }, inlinedProperties);