diff --git a/spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java b/spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java index 806229cb4ed..ac0375f2dd1 100644 --- a/spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java +++ b/spring-core/src/main/java/org/springframework/aot/hint/BindingReflectionHintsRegistrar.java @@ -159,6 +159,10 @@ public class BindingReflectionHintsRegistrar { for (ResolvableType genericResolvableType : resolvableType.getGenerics()) { collectReferencedTypes(types, genericResolvableType); } + Class superClass = clazz.getSuperclass(); + if (superClass != null && superClass != Object.class && superClass != Record.class && superClass != Enum.class) { + types.add(superClass); + } } } diff --git a/spring-core/src/test/java/org/springframework/aot/hint/BindingReflectionHintsRegistrarTests.java b/spring-core/src/test/java/org/springframework/aot/hint/BindingReflectionHintsRegistrarTests.java index 5c14b829e69..d057197d9ff 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/BindingReflectionHintsRegistrarTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/BindingReflectionHintsRegistrarTests.java @@ -63,6 +63,28 @@ class BindingReflectionHintsRegistrarTests { }); } + @Test + void registerTypeForSerializationWithExtendingClass() { + bindingRegistrar.registerReflectionHints(this.hints.reflection(), SampleExtendingClass.class); + assertThat(this.hints.reflection().typeHints()).satisfiesExactlyInAnyOrder( + typeHint -> { + assertThat(typeHint.getType()).isEqualTo(TypeReference.of(SampleEmptyClass.class)); + assertThat(typeHint.getMemberCategories()).containsExactlyInAnyOrder( + MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); + assertThat(typeHint.constructors()).isEmpty(); + assertThat(typeHint.fields()).isEmpty(); + assertThat(typeHint.methods()).isEmpty(); + }, + typeHint -> { + assertThat(typeHint.getType()).isEqualTo(TypeReference.of(SampleExtendingClass.class)); + assertThat(typeHint.getMemberCategories()).containsExactlyInAnyOrder( + MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); + assertThat(typeHint.constructors()).isEmpty(); + assertThat(typeHint.fields()).isEmpty(); + assertThat(typeHint.methods()).isEmpty(); + }); + } + @Test void registerTypeForSerializationWithNoProperty() { bindingRegistrar.registerReflectionHints(this.hints.reflection(), SampleClassWithNoProperty.class); @@ -284,6 +306,9 @@ class BindingReflectionHintsRegistrarTests { static class SampleEmptyClass { } + static class SampleExtendingClass extends SampleEmptyClass { + } + static class SampleClassWithNoProperty { String name() {