diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/ProblemDetailRuntimeHints.java b/spring-web/src/main/java/org/springframework/http/converter/json/ProblemDetailRuntimeHints.java index 311a615e63..3f569c44d3 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/ProblemDetailRuntimeHints.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/ProblemDetailRuntimeHints.java @@ -20,12 +20,14 @@ import org.springframework.aot.hint.BindingReflectionHintsRegistrar; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; import org.springframework.http.ProblemDetail; +import org.springframework.util.ClassUtils; /** * {@link RuntimeHintsRegistrar} implementation that registers binding reflection entries * for {@link ProblemDetail} serialization support with Jackson. * * @author Brian Clozel + * @author Stephane Nicoll * @since 6.0.5 */ class ProblemDetailRuntimeHints implements RuntimeHintsRegistrar { @@ -34,6 +36,12 @@ class ProblemDetailRuntimeHints implements RuntimeHintsRegistrar { public void registerHints(RuntimeHints hints, ClassLoader classLoader) { BindingReflectionHintsRegistrar bindingRegistrar = new BindingReflectionHintsRegistrar(); bindingRegistrar.registerReflectionHints(hints.reflection(), ProblemDetail.class); + if (ClassUtils.isPresent("com.fasterxml.jackson.dataformat.xml.XmlMapper", classLoader)) { + bindingRegistrar.registerReflectionHints(hints.reflection(), ProblemDetailJacksonXmlMixin.class); + } + else if (ClassUtils.isPresent("com.fasterxml.jackson.annotation.JacksonAnnotation", classLoader)) { + bindingRegistrar.registerReflectionHints(hints.reflection(), ProblemDetailJacksonMixin.class); + } } } diff --git a/spring-web/src/test/java/org/springframework/http/converter/json/ProblemDetailRuntimeHintsTests.java b/spring-web/src/test/java/org/springframework/http/converter/json/ProblemDetailRuntimeHintsTests.java index 59417ecd3e..c094e8a0e3 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/json/ProblemDetailRuntimeHintsTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/json/ProblemDetailRuntimeHintsTests.java @@ -37,6 +37,9 @@ import static org.assertj.core.api.Assertions.assertThat; */ class ProblemDetailRuntimeHintsTests { + private static final List METHOD_NAMES = List.of("getType", "getTitle", + "getStatus", "getDetail", "getInstance", "getProperties"); + private final RuntimeHints hints = new RuntimeHints(); @BeforeEach @@ -48,9 +51,17 @@ class ProblemDetailRuntimeHintsTests { @Test void getterMethodsShouldHaveReflectionHints() { - List methodNames = List.of("getType", "getTitle", "getStatus", "getDetail", "getInstance", "getProperties"); - for (String methodName : methodNames) { - assertThat(RuntimeHintsPredicates.reflection().onMethod(ProblemDetail.class, methodName)).accepts(this.hints); + for (String methodName : METHOD_NAMES) { + assertThat(RuntimeHintsPredicates.reflection() + .onMethod(ProblemDetail.class, methodName)).accepts(this.hints); + } + } + + @Test + void mixinShouldHaveReflectionHints() { + for (String methodName : METHOD_NAMES) { + assertThat(RuntimeHintsPredicates.reflection() + .onMethod(ProblemDetailJacksonXmlMixin.class, methodName)).accepts(this.hints); } }