Skip to content

Commit 5d2d981

Browse files
committed
GH-1300 Add support for post processing Kotlin functions
Resolves #1300
1 parent 59ea0aa commit 5d2d981

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/SimpleFunctionRegistry.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.springframework.cloud.function.context.FunctionRegistration;
5757
import org.springframework.cloud.function.context.FunctionRegistry;
5858
import org.springframework.cloud.function.context.PostProcessingFunction;
59+
import org.springframework.cloud.function.context.config.KotlinLambdaToFunctionAutoConfiguration;
5960
import org.springframework.cloud.function.context.config.RoutingFunction;
6061
import org.springframework.cloud.function.core.FunctionInvocationHelper;
6162
import org.springframework.cloud.function.json.JsonMapper;
@@ -72,12 +73,15 @@
7273
import org.springframework.messaging.converter.MessageConverter;
7374
import org.springframework.messaging.support.MessageBuilder;
7475
import org.springframework.util.Assert;
76+
import org.springframework.util.ClassUtils;
7577
import org.springframework.util.CollectionUtils;
7678
import org.springframework.util.MimeTypeUtils;
7779
import org.springframework.util.ObjectUtils;
7880
import org.springframework.util.StringUtils;
7981

8082

83+
84+
8185
/**
8286
* Implementation of {@link FunctionCatalog} and {@link FunctionRegistry} which
8387
* does not depend on Spring's {@link BeanFactory}.
@@ -443,6 +447,11 @@ public class FunctionInvocationWrapper implements Function<Object, Object>, Cons
443447
if (target instanceof PostProcessingFunction) {
444448
this.postProcessor = (PostProcessingFunction) target;
445449
}
450+
if (ClassUtils.isPresent("kotlin.jvm.functions.Function0", ClassUtils.getDefaultClassLoader())
451+
&& target instanceof KotlinLambdaToFunctionAutoConfiguration.KotlinFunctionWrapper kotlinFunction
452+
&& kotlinFunction.getKotlinLambdaTarget() instanceof PostProcessingFunction) {
453+
this.postProcessor = (PostProcessingFunction) kotlinFunction.getKotlinLambdaTarget();
454+
}
446455
this.target = target;
447456
this.inputType = this.normalizeType(inputType);
448457
this.outputType = this.normalizeType(outputType);
@@ -770,6 +779,9 @@ else if (this.isConsumer()) {
770779
}
771780

772781
if (this.postProcessor != null) {
782+
if (!(result instanceof Message)) {
783+
result = MessageBuilder.withPayload(result).build();
784+
}
773785
this.unconvertedResult.set((Message<Object>) result);
774786
}
775787

spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ public class KotlinLambdaToFunctionAutoConfiguration {
6262
public static final class KotlinFunctionWrapper implements Function<Object, Object>, Supplier<Object>, Consumer<Object>,
6363
Function0<Object>, Function1<Object, Object>, Function2<Object, Object, Object>,
6464
Function3<Object, Object, Object, Object>, Function4<Object, Object, Object, Object, Object> {
65+
66+
6567
private final Object kotlinLambdaTarget;
6668

6769
private String name;
@@ -72,6 +74,10 @@ public KotlinFunctionWrapper(Object kotlinLambdaTarget) {
7274
this.kotlinLambdaTarget = kotlinLambdaTarget;
7375
}
7476

77+
public Object getKotlinLambdaTarget() {
78+
return kotlinLambdaTarget;
79+
}
80+
7581
@Override
7682
public Object apply(Object input) {
7783
if (ObjectUtils.isEmpty(input)) {

0 commit comments

Comments
 (0)