Skip to content

Commit d9d45cc

Browse files
committed
Treat Reactive Publishers the same as Kotlin Flows
This commit makes sure that CoroutinesUtils::invokeSuspendingFunction treats Reactive Publisher instances the same as Kotlin Flows, i.e. it flatmaps them. Closes gh-27011
1 parent 279f964 commit d9d45cc

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import kotlin.Unit;
2424
import kotlin.jvm.JvmClassMappingKt;
25+
import kotlin.reflect.KClass;
2526
import kotlin.reflect.KClassifier;
2627
import kotlin.reflect.KFunction;
2728
import kotlin.reflect.full.KCallables;
@@ -75,13 +76,23 @@ public static Publisher<?> invokeSuspendingFunction(Method method, Object target
7576
if (method.isAccessible() && !KCallablesJvm.isAccessible(function)) {
7677
KCallablesJvm.setAccessible(function, true);
7778
}
78-
KClassifier classifier = function.getReturnType().getClassifier();
7979
Mono<Object> mono = MonoKt.mono(Dispatchers.getUnconfined(), (scope, continuation) ->
8080
KCallables.callSuspend(function, getSuspendedFunctionArgs(target, args), continuation))
8181
.filter(result -> !Objects.equals(result, Unit.INSTANCE))
8282
.onErrorMap(InvocationTargetException.class, InvocationTargetException::getTargetException);
83-
if (classifier != null && classifier.equals(JvmClassMappingKt.getKotlinClass(Flow.class))) {
84-
return mono.flatMapMany(CoroutinesUtils::asFlux);
83+
84+
KClassifier returnType = function.getReturnType().getClassifier();
85+
if (returnType != null) {
86+
if (returnType.equals(JvmClassMappingKt.getKotlinClass(Flow.class))) {
87+
return mono.flatMapMany(CoroutinesUtils::asFlux);
88+
}
89+
else if (returnType.equals(JvmClassMappingKt.getKotlinClass(Mono.class))) {
90+
return mono.flatMap(o -> ((Mono<?>)o));
91+
}
92+
else if (returnType instanceof KClass<?> kClass &&
93+
Publisher.class.isAssignableFrom(JvmClassMappingKt.getJavaClass(kClass))) {
94+
return mono.flatMapMany(o -> ((Publisher<?>)o));
95+
}
8596
}
8697
return mono;
8798
}

0 commit comments

Comments
 (0)