Skip to content

Commit fb1aa4f

Browse files
committed
Fix BindingReflectionHintsRegistrar enum support
This commit prevents a StackOverflowError in BindingReflectionHintsRegistrar when processing enum types and refine related generated hints. See spring-projectsgh-28683
1 parent 730d6c9 commit fb1aa4f

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed

spring-core/src/main/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrar.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ private void registerReflectionHints(ReflectionHints hints, Set<Type> seen, Type
9898
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
9999
for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
100100
Method writeMethod = propertyDescriptor.getWriteMethod();
101-
if (writeMethod != null && writeMethod.getDeclaringClass() != Object.class) {
101+
if (writeMethod != null && writeMethod.getDeclaringClass() != Object.class
102+
&& writeMethod.getDeclaringClass() != Enum.class) {
102103
hints.registerMethod(writeMethod, INVOKE);
103104
MethodParameter methodParameter = MethodParameter.forExecutable(writeMethod, 0);
104105
Type methodParameterType = methodParameter.getGenericParameterType();
@@ -107,7 +108,8 @@ private void registerReflectionHints(ReflectionHints hints, Set<Type> seen, Type
107108
}
108109
}
109110
Method readMethod = propertyDescriptor.getReadMethod();
110-
if (readMethod != null && readMethod.getDeclaringClass() != Object.class) {
111+
if (readMethod != null && readMethod.getDeclaringClass() != Object.class
112+
&& readMethod.getDeclaringClass() != Enum.class) {
111113
hints.registerMethod(readMethod, INVOKE);
112114
MethodParameter methodParameter = MethodParameter.forExecutable(readMethod, -1);
113115
Type methodParameterType = methodParameter.getGenericParameterType();
@@ -144,7 +146,7 @@ private void collectReferencedTypes(Set<Type> seen, Set<Class<?>> types, @Nullab
144146
}
145147
ResolvableType resolvableType = ResolvableType.forType(type);
146148
Class<?> clazz = resolvableType.resolve();
147-
if (clazz != null) {
149+
if (clazz != null && !types.contains(clazz)) {
148150
types.add(clazz);
149151
for (ResolvableType genericResolvableType : resolvableType.getGenerics()) {
150152
collectReferencedTypes(seen, types, genericResolvableType.getType());

spring-core/src/test/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrarTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,13 @@ void registerTypeForSerializationWithMultipleLevelsAndCollection() {
196196
typeHint -> assertThat(typeHint.getType()).isEqualTo(TypeReference.of(Set.class)));
197197
}
198198

199+
@Test
200+
void registerTypeForSerializationWithEnum() {
201+
bindingRegistrar.registerReflectionHints(this.hints.reflection(), SampleEnum.class);
202+
assertThat(this.hints.reflection().typeHints()).singleElement()
203+
.satisfies(typeHint -> assertThat(typeHint.getType()).isEqualTo(TypeReference.of(SampleEnum.class)));
204+
}
205+
199206

200207
static class SampleEmptyClass {
201208
}
@@ -274,4 +281,8 @@ public String getString() {
274281
}
275282
}
276283

284+
enum SampleEnum {
285+
value1, value2
286+
}
287+
277288
}

0 commit comments

Comments
 (0)