Skip to content

Commit c996e43

Browse files
committed
Fix singleton handling of ConfigurationProperties hints
Closes spring-projectsgh-31248
1 parent cf19c17 commit c996e43

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanFactoryInitializationAotProcessor.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
4040
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
4141
import org.springframework.beans.factory.aot.BeanFactoryInitializationCode;
42-
import org.springframework.beans.factory.config.BeanDefinition;
4342
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
4443
import org.springframework.boot.context.properties.bind.Bindable;
4544
import org.springframework.core.ResolvableType;
@@ -64,8 +63,10 @@ public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableL
6463
String[] beanNames = beanFactory.getBeanNamesForAnnotation(ConfigurationProperties.class);
6564
List<Class<?>> types = new ArrayList<>();
6665
for (String beanName : beanNames) {
67-
BeanDefinition beanDefinition = beanFactory.getMergedBeanDefinition(beanName);
68-
types.add(ClassUtils.getUserClass(beanDefinition.getResolvableType().toClass()));
66+
Class<?> beanType = beanFactory.getType(beanName, false);
67+
if (beanType != null) {
68+
types.add(ClassUtils.getUserClass(beanType));
69+
}
6970
}
7071
if (!CollectionUtils.isEmpty(types)) {
7172
return new ConfigurationPropertiesReflectionHintsContribution(types);

spring-boot-project/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBeanFactoryInitializationAotProcessorTests.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
3838
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
3939
import org.springframework.beans.factory.aot.BeanFactoryInitializationCode;
40+
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
4041
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
4142
import org.springframework.beans.factory.support.RootBeanDefinition;
4243
import org.springframework.context.ApplicationContext;
@@ -61,7 +62,6 @@ void configurationPropertiesBeanFactoryInitializationAotProcessorIsRegistered()
6162
assertThat(new AotFactoriesLoader(new DefaultListableBeanFactory())
6263
.load(BeanFactoryInitializationAotProcessor.class))
6364
.anyMatch(ConfigurationPropertiesBeanFactoryInitializationAotProcessor.class::isInstance);
64-
6565
}
6666

6767
@Test
@@ -71,6 +71,15 @@ void processNoMatchesReturnsNullContribution() {
7171
assertThat(this.processor.processAheadOfTime(beanFactory)).isNull();
7272
}
7373

74+
@Test
75+
void processManuallyRegisteredSingleton() {
76+
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
77+
beanFactory.registerSingleton("test", new SampleProperties());
78+
RuntimeHints runtimeHints = process(beanFactory);
79+
assertThat(runtimeHints.reflection().typeHints()).singleElement()
80+
.satisfies(javaBeanBinding(SampleProperties.class));
81+
}
82+
7483
@Test
7584
void processJavaBeanConfigurationProperties() {
7685
RuntimeHints runtimeHints = process(SampleProperties.class);
@@ -245,6 +254,10 @@ private RuntimeHints process(Class<?>... types) {
245254
for (Class<?> type : types) {
246255
beanFactory.registerBeanDefinition(type.getName(), new RootBeanDefinition(type));
247256
}
257+
return process(beanFactory);
258+
}
259+
260+
private RuntimeHints process(ConfigurableListableBeanFactory beanFactory) {
248261
BeanFactoryInitializationAotContribution contribution = this.processor.processAheadOfTime(beanFactory);
249262
assertThat(contribution).isNotNull();
250263
GenerationContext generationContext = new DefaultGenerationContext(new InMemoryGeneratedFiles());

0 commit comments

Comments
 (0)