From 1aaa44bbfe4a6efbab09f3ac48fe6babd60b2ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Fri, 24 Jun 2022 15:40:03 +0200 Subject: [PATCH] Refine BindingReflectionHintsRegistrar This commit refines BindingReflectionHintsRegistrar to handle correctly a use case with multiple levels of nested generics. Closes gh-28683 --- .../BindingReflectionHintsRegistrar.java | 1 - .../BindingReflectionHintsRegistrarTests.java | 30 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/spring-core/src/main/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrar.java b/spring-core/src/main/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrar.java index 62993cd544b..50da0e894bd 100644 --- a/spring-core/src/main/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrar.java +++ b/spring-core/src/main/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrar.java @@ -142,7 +142,6 @@ public class BindingReflectionHintsRegistrar { if (type == null || seen.contains(type)) { return; } - seen.add(type); ResolvableType resolvableType = ResolvableType.forType(type); Class clazz = resolvableType.resolve(); if (clazz != null) { diff --git a/spring-core/src/test/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrarTests.java b/spring-core/src/test/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrarTests.java index 8c688246cb2..d934d3a0ccb 100644 --- a/spring-core/src/test/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrarTests.java +++ b/spring-core/src/test/java/org/springframework/aot/hint/support/BindingReflectionHintsRegistrarTests.java @@ -18,6 +18,7 @@ package org.springframework.aot.hint.support; import java.lang.reflect.Type; import java.util.List; +import java.util.Set; import org.junit.jupiter.api.Test; @@ -184,6 +185,17 @@ public class BindingReflectionHintsRegistrarTests { }); } + @Test + void registerTypeForSerializationWithMultipleLevelsAndCollection() { + bindingRegistrar.registerReflectionHints(this.hints.reflection(), SampleClassA.class); + assertThat(this.hints.reflection().typeHints()).satisfiesExactlyInAnyOrder( + typeHint -> assertThat(typeHint.getType()).isEqualTo(TypeReference.of(SampleClassA.class)), + typeHint -> assertThat(typeHint.getType()).isEqualTo(TypeReference.of(SampleClassB.class)), + typeHint -> assertThat(typeHint.getType()).isEqualTo(TypeReference.of(SampleClassC.class)), + typeHint -> assertThat(typeHint.getType()).isEqualTo(TypeReference.of(String.class)), + typeHint -> assertThat(typeHint.getType()).isEqualTo(TypeReference.of(Set.class))); + } + static class SampleEmptyClass { } @@ -244,4 +256,22 @@ public class BindingReflectionHintsRegistrarTests { } } + static class SampleClassA { + public Set getB() { + return null; + } + } + + static class SampleClassB { + public SampleClassC getC() { + return null; + } + } + + class SampleClassC { + public String getString() { + return ""; + } + } + }