Skip to content

Commit 57d4765

Browse files
T45Ksdeleuze
authored andcommitted
Fix nullable value class handling in CoroutinesUtils
Closes gh-36643 Signed-off-by: T45K <tasktas9@gmail.com>
1 parent cbdec80 commit 57d4765

2 files changed

Lines changed: 9 additions & 2 deletions

File tree

spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public static Publisher<?> invokeSuspendingFunction(
129129
Object arg = args[index];
130130
if (!(parameter.isOptional() && arg == null)) {
131131
KType type = parameter.getType();
132-
if (!(type.isMarkedNullable() && arg == null) &&
132+
if (!type.isMarkedNullable() &&
133133
type.getClassifier() instanceof KClass<?> kClass &&
134134
KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) {
135135
arg = box(kClass, arg);
@@ -161,7 +161,7 @@ public static Publisher<?> invokeSuspendingFunction(
161161
private static Object box(KClass<?> kClass, @Nullable Object arg) {
162162
KFunction<?> constructor = Objects.requireNonNull(KClasses.getPrimaryConstructor(kClass));
163163
KType type = constructor.getParameters().get(0).getType();
164-
if (!(type.isMarkedNullable() && arg == null) &&
164+
if (!type.isMarkedNullable() &&
165165
type.getClassifier() instanceof KClass<?> parameterClass &&
166166
KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(parameterClass))) {
167167
arg = box(parameterClass, arg);

spring-core/src/test/kotlin/org/springframework/core/CoroutinesUtilsTests.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,13 @@ class CoroutinesUtilsTests {
237237
}
238238
}
239239

240+
@Test
241+
suspend fun invokeSuspendingFunctionWithNullableValueClassParameterWithNonnullObject() {
242+
val method = CoroutinesUtilsTests::class.java.declaredMethods.first { it.name.startsWith("suspendingFunctionWithNullableValueClass") }
243+
val mono = CoroutinesUtils.invokeSuspendingFunction(method, this, ValueClass("foo"), null) as Mono
244+
Assertions.assertThat(mono.awaitSingleOrNull()).isEqualTo("foo")
245+
}
246+
240247
@Test
241248
fun invokeSuspendingFunctionWithNullableValueClassParameter() {
242249
val method = CoroutinesUtilsTests::class.java.declaredMethods.first { it.name.startsWith("suspendingFunctionWithNullableValueClass") }

0 commit comments

Comments
 (0)