From 3fce1e97159ae58ca2c0ef85792e67a5e4f5b825 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Thu, 3 Nov 2022 17:44:26 +0000 Subject: [PATCH] Fix reflection hint registration for @JsonMixins The hints need to be registered for the mixin not the target of the mixin. Closes gh-32929 --- ...sonMixinModuleEntriesBeanRegistrationAotProcessor.java | 2 +- ...xinModuleEntriesBeanRegistrationAotProcessorTests.java | 8 ++++++-- .../boot/jackson/scan/a/RenameMixInClass.java | 6 ++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonMixinModuleEntriesBeanRegistrationAotProcessor.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonMixinModuleEntriesBeanRegistrationAotProcessor.java index 6fa0d2e499..090999126f 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonMixinModuleEntriesBeanRegistrationAotProcessor.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/jackson/JsonMixinModuleEntriesBeanRegistrationAotProcessor.java @@ -98,7 +98,7 @@ class JsonMixinModuleEntriesBeanRegistrationAotProcessor implements BeanRegistra private void contributeHints(RuntimeHints runtimeHints, JsonMixinModuleEntries entries) { Set> mixins = new LinkedHashSet<>(); - entries.doWithEntry(this.classLoader, (type, mixin) -> mixins.add(type)); + entries.doWithEntry(this.classLoader, (type, mixin) -> mixins.add(mixin)); new BindingReflectionHintsRegistrar().registerReflectionHints(runtimeHints.reflection(), mixins.toArray(Class[]::new)); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jackson/JsonMixinModuleEntriesBeanRegistrationAotProcessorTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jackson/JsonMixinModuleEntriesBeanRegistrationAotProcessorTests.java index 7188944221..b6f0a4eff6 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jackson/JsonMixinModuleEntriesBeanRegistrationAotProcessorTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jackson/JsonMixinModuleEntriesBeanRegistrationAotProcessorTests.java @@ -24,6 +24,7 @@ import java.util.function.BiConsumer; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; +import org.springframework.aot.hint.MemberCategory; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; import org.springframework.aot.test.generate.TestGenerationContext; @@ -62,8 +63,11 @@ class JsonMixinModuleEntriesBeanRegistrationAotProcessorTests { registerEntries(RenameMixInClass.class); processAheadOfTime(); RuntimeHints runtimeHints = this.generationContext.getRuntimeHints(); - assertThat(RuntimeHintsPredicates.reflection().onMethod(Name.class, "getName")).accepts(runtimeHints); - assertThat(RuntimeHintsPredicates.reflection().onMethod(NameAndAge.class, "getAge")).accepts(runtimeHints); + assertThat(RuntimeHintsPredicates.reflection().onType(RenameMixInClass.class) + .withMemberCategories(MemberCategory.DECLARED_FIELDS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)) + .accepts(runtimeHints); + assertThat(RuntimeHintsPredicates.reflection().onMethod(RenameMixInClass.class, "getName").introspect()) + .accepts(runtimeHints); } @Test diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jackson/scan/a/RenameMixInClass.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jackson/scan/a/RenameMixInClass.java index 15d401f598..a303f007b3 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jackson/scan/a/RenameMixInClass.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jackson/scan/a/RenameMixInClass.java @@ -23,11 +23,9 @@ import org.springframework.boot.jackson.Name; import org.springframework.boot.jackson.NameAndAge; @JsonMixin(type = { Name.class, NameAndAge.class }) -public class RenameMixInClass { +public abstract class RenameMixInClass { @JsonProperty("username") - String getName() { - return null; - } + public abstract String getName(); }