Fix singleton handling of ConfigurationProperties hints

Closes gh-31248
This commit is contained in:
Stephane Nicoll 2022-06-04 12:29:45 +02:00
parent cf19c176f6
commit c996e4335a
2 changed files with 18 additions and 4 deletions

View File

@ -39,7 +39,6 @@ import org.springframework.beans.ExtendedBeanInfoFactory;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
import org.springframework.beans.factory.aot.BeanFactoryInitializationCode;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.core.ResolvableType;
@ -64,8 +63,10 @@ class ConfigurationPropertiesBeanFactoryInitializationAotProcessor implements Be
String[] beanNames = beanFactory.getBeanNamesForAnnotation(ConfigurationProperties.class);
List<Class<?>> types = new ArrayList<>();
for (String beanName : beanNames) {
BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition(beanName);
types.add(ClassUtils.getUserClass(beanDefinition.getResolvableType().toClass()));
Class<?> beanType = beanFactory.getType(beanName, false);
if (beanType != null) {
types.add(ClassUtils.getUserClass(beanType));
}
}
if (!CollectionUtils.isEmpty(types)) {
return new ConfigurationPropertiesReflectionHintsContribution(types);

View File

@ -37,6 +37,7 @@ import org.springframework.beans.factory.aot.AotFactoriesLoader;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
import org.springframework.beans.factory.aot.BeanFactoryInitializationCode;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.ApplicationContext;
@ -61,7 +62,6 @@ class ConfigurationPropertiesBeanFactoryInitializationAotProcessorTests {
assertThat(new AotFactoriesLoader(new DefaultListableBeanFactory())
.load(BeanFactoryInitializationAotProcessor.class))
.anyMatch(ConfigurationPropertiesBeanFactoryInitializationAotProcessor.class::isInstance);
}
@Test
@ -71,6 +71,15 @@ class ConfigurationPropertiesBeanFactoryInitializationAotProcessorTests {
assertThat(this.processor.processAheadOfTime(beanFactory)).isNull();
}
@Test
void processManuallyRegisteredSingleton() {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerSingleton("test", new SampleProperties());
RuntimeHints runtimeHints = process(beanFactory);
assertThat(runtimeHints.reflection().typeHints()).singleElement()
.satisfies(javaBeanBinding(SampleProperties.class));
}
@Test
void processJavaBeanConfigurationProperties() {
RuntimeHints runtimeHints = process(SampleProperties.class);
@ -245,6 +254,10 @@ class ConfigurationPropertiesBeanFactoryInitializationAotProcessorTests {
for (Class<?> type : types) {
beanFactory.registerBeanDefinition(type.getName(), new RootBeanDefinition(type));
}
return process(beanFactory);
}
private RuntimeHints process(ConfigurableListableBeanFactory beanFactory) {
BeanFactoryInitializationAotContribution contribution = this.processor.processAheadOfTime(beanFactory);
assertThat(contribution).isNotNull();
GenerationContext generationContext = new DefaultGenerationContext(new InMemoryGeneratedFiles());