From 7bb19fcde85f6964d83b8d7df8f06c7bb6a142c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Mon, 9 Jun 2025 16:48:10 +0200 Subject: [PATCH] Refine Kotlin Serialization hint registration This commit adds support for serializer methods with a parameter. Closes gh-34979 --- .../hint/BindingReflectionHintsRegistrar.java | 5 +++-- ...dingReflectionHintsRegistrarKotlinTests.kt | 22 ++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) 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 c3030f5b20f..50117c499b7 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 @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -150,7 +150,8 @@ public class BindingReflectionHintsRegistrar { String companionClassName = clazz.getCanonicalName() + KOTLIN_COMPANION_SUFFIX; if (ClassUtils.isPresent(companionClassName, null)) { Class companionClass = ClassUtils.resolveClassName(companionClassName, null); - Method serializerMethod = ClassUtils.getMethodIfAvailable(companionClass, "serializer"); + Method serializerMethod = ClassUtils.getMethodIfAvailable(companionClass, "serializer", + (Class[]) null); if (serializerMethod != null) { hints.registerMethod(serializerMethod, ExecutableMode.INVOKE); } diff --git a/spring-core/src/test/kotlin/org/springframework/aot/hint/BindingReflectionHintsRegistrarKotlinTests.kt b/spring-core/src/test/kotlin/org/springframework/aot/hint/BindingReflectionHintsRegistrarKotlinTests.kt index 861f3432555..7f27ed09bda 100644 --- a/spring-core/src/test/kotlin/org/springframework/aot/hint/BindingReflectionHintsRegistrarKotlinTests.kt +++ b/spring-core/src/test/kotlin/org/springframework/aot/hint/BindingReflectionHintsRegistrarKotlinTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -81,6 +81,12 @@ class BindingReflectionHintsRegistrarKotlinTests { assertThat(RuntimeHintsPredicates.reflection().onType(SampleClass::class.java) .withMemberCategory(MemberCategory.INTROSPECT_DECLARED_METHODS)).accepts(hints) } + + @Test + fun `Register reflection hints on serializer function with parameter`() { + bindingRegistrar.registerReflectionHints(hints.reflection(), SampleResult::class.java) + assertThat(RuntimeHintsPredicates.reflection().onMethod(SampleResult.Companion::class.java, "serializer")).accepts(hints) + } } @kotlinx.serialization.Serializable @@ -89,3 +95,17 @@ class SampleSerializableClass(val name: String) data class SampleDataClass(val name: String, val isNonNullable: Boolean, val isNullable: Boolean?) class SampleClass(val name: String) + +@kotlinx.serialization.Serializable +data class SampleResult ( + val code: Int, + val message: String, + val data: T, +) { + companion object { + private const val SUCCESS: Int = 200 + private const val FAILURE: Int = 500 + fun success(message: String, data: T) = SampleResult(code = SUCCESS, message = message, data = data) + fun failure(message: String, data: T) = SampleResult(code = FAILURE, message = message, data = data) + } +}