Skip to content
This repository was archived by the owner on Feb 23, 2023. It is now read-only.

Commit f4992ff

Browse files
kazuki43zoosnicoll
authored andcommitted
Fix StackOverflowError when processing ConfigurationProperties
See gh-1420
1 parent 79b9851 commit f4992ff

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

spring-aot/src/main/java/org/springframework/boot/context/properties/ConfigurationPropertiesNativeConfigurationProcessor.java

+3
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ private static boolean hasConstructorBinding(AnnotatedElement element) {
9999
}
100100

101101
private void process(NativeConfigurationRegistry registry) {
102+
if (registry.reflection().reflectionEntries().anyMatch(x -> x.getType() == this.type)) {
103+
return;
104+
}
102105
Builder reflection = registry.reflection().forType(this.type);
103106
if (isClassOnlyReflectionType()) {
104107
return;

spring-aot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesNativeConfigurationProcessorTests.java

+51
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,17 @@ void processConfigurationPropertiesWithWellKnownTypes() {
235235
.anySatisfy(classOnlyBinding(Environment.class)).hasSize(3);
236236
}
237237

238+
@Test
239+
void processConfigurationPropertiesWithCrossReference() {
240+
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
241+
beanFactory.registerBeanDefinition("beanA", BeanDefinitionBuilder.rootBeanDefinition(SamplePropertiesWithCrossReference.class).getBeanDefinition());
242+
NativeConfigurationRegistry registry = process(beanFactory);
243+
assertThat(registry.reflection().reflectionEntries())
244+
.anySatisfy(javaBeanBinding(SamplePropertiesWithCrossReference.class))
245+
.anySatisfy(javaBeanBinding(CrossReferenceA.class))
246+
.anySatisfy(javaBeanBinding(CrossReferenceB.class)).hasSize(3);
247+
}
248+
238249
private Consumer<DefaultNativeReflectionEntry> classOnlyBinding(Class<?> type) {
239250
return (entry) -> {
240251
assertThat(entry.getType()).isEqualTo(type);
@@ -523,4 +534,44 @@ public ImmutableRecursive(ImmutableRecursive recursive) {
523534

524535
}
525536

537+
538+
@ConfigurationProperties("crossReference")
539+
static class SamplePropertiesWithCrossReference {
540+
541+
@NestedConfigurationProperty
542+
private CrossReferenceA crossReferenceA;
543+
544+
public void setCrossReferenceA(CrossReferenceA crossReferenceA) {
545+
this.crossReferenceA = crossReferenceA;
546+
}
547+
548+
public CrossReferenceA getCrossReferenceA() {
549+
return crossReferenceA;
550+
}
551+
}
552+
553+
static class CrossReferenceA {
554+
private CrossReferenceB crossReferenceB;
555+
556+
public void setCrossReferenceB(CrossReferenceB crossReferenceB) {
557+
this.crossReferenceB = crossReferenceB;
558+
}
559+
560+
public CrossReferenceB getCrossReferenceB() {
561+
return crossReferenceB;
562+
}
563+
}
564+
565+
static class CrossReferenceB {
566+
private CrossReferenceA crossReferenceA;
567+
568+
public void setCrossReferenceA(CrossReferenceA crossReferenceA) {
569+
this.crossReferenceA = crossReferenceA;
570+
}
571+
572+
public CrossReferenceA getCrossReferenceA() {
573+
return crossReferenceA;
574+
}
575+
}
576+
526577
}

0 commit comments

Comments
 (0)