From f70446aacd69ef68a2b963e695fbf9c06958d3e4 Mon Sep 17 00:00:00 2001 From: T45K Date: Fri, 13 Mar 2026 17:21:15 +0900 Subject: [PATCH] remove "args == null" condition to handle nullable value class param correctly Signed-off-by: T45K --- .../java/org/springframework/core/CoroutinesUtils.java | 4 ++-- .../org/springframework/core/CoroutinesUtilsTests.kt | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java b/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java index 2d1e509b52dd..568d94b6c03f 100644 --- a/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java +++ b/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java @@ -134,7 +134,7 @@ public static Publisher invokeSuspendingFunction( Object arg = args[index]; if (!(parameter.isOptional() && arg == null)) { KType type = parameter.getType(); - if (!(type.isMarkedNullable() && arg == null) && + if (!type.isMarkedNullable() && type.getClassifier() instanceof KClass kClass && KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) { arg = box(kClass, arg); @@ -166,7 +166,7 @@ public static Publisher invokeSuspendingFunction( private static Object box(KClass kClass, @Nullable Object arg) { KFunction constructor = Objects.requireNonNull(KClasses.getPrimaryConstructor(kClass)); KType type = constructor.getParameters().get(0).getType(); - if (!(type.isMarkedNullable() && arg == null) && + if (!type.isMarkedNullable() && type.getClassifier() instanceof KClass parameterClass && KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(parameterClass))) { arg = box(parameterClass, arg); diff --git a/spring-core/src/test/kotlin/org/springframework/core/CoroutinesUtilsTests.kt b/spring-core/src/test/kotlin/org/springframework/core/CoroutinesUtilsTests.kt index c03a2039d302..6e0a13342f60 100644 --- a/spring-core/src/test/kotlin/org/springframework/core/CoroutinesUtilsTests.kt +++ b/spring-core/src/test/kotlin/org/springframework/core/CoroutinesUtilsTests.kt @@ -229,6 +229,13 @@ class CoroutinesUtilsTests { } } + @Test + suspend fun invokeSuspendingFunctionWithNullableValueClassParameterWithNonnullObject() { + val method = CoroutinesUtilsTests::class.java.declaredMethods.first { it.name.startsWith("suspendingFunctionWithNullableValueClass") } + val mono = CoroutinesUtils.invokeSuspendingFunction(method, this, ValueClass("foo"), null) as Mono + Assertions.assertThat(mono.awaitSingleOrNull()).isEqualTo("foo") + } + @Test suspend fun invokeSuspendingFunctionWithNullableValueClassParameter() { val method = CoroutinesUtilsTests::class.java.declaredMethods.first { it.name.startsWith("suspendingFunctionWithNullableValueClass") }