diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionType.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionType.java index c09cd8379..540ddf5e2 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionType.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/FunctionType.java @@ -32,6 +32,7 @@ import reactor.core.publisher.Flux; import org.springframework.core.ResolvableType; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.messaging.Message; +import org.springframework.util.ObjectUtils; import org.springframework.util.ReflectionUtils; /** @@ -105,7 +106,14 @@ public class FunctionType { } public static FunctionType of(Type function) { - return new FunctionType(function); + FunctionType ft = new FunctionType(function); + if (!ft.isWrapper() && !(ft.type instanceof ParameterizedType)) { + Type[] genericInterfaces = ((Class) function).getGenericInterfaces(); + if (!ObjectUtils.isEmpty(genericInterfaces)) { + ft.type = genericInterfaces[0]; + } + } + return ft; } public static FunctionType from(Class input) { diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/FunctionTypeTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/FunctionTypeTests.java index 374782631..08b030239 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/FunctionTypeTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/FunctionTypeTests.java @@ -16,6 +16,7 @@ package org.springframework.cloud.function.context; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Collections; import java.util.Map; @@ -25,6 +26,8 @@ import java.util.function.Supplier; import org.junit.Test; import reactor.core.publisher.Flux; +import reactor.util.function.Tuple2; +import reactor.util.function.Tuple3; import org.springframework.core.ResolvableType; import org.springframework.messaging.Message; @@ -38,6 +41,12 @@ import static org.assertj.core.api.Assertions.assertThat; */ public class FunctionTypeTests { + @Test + public void functionWithTuples() { + FunctionType functionType = FunctionType.of(MyFunction.class); + assertThat(functionType.getType()).isInstanceOf(ParameterizedType.class); + } + @Test public void plainFunction() { FunctionType function = new FunctionType(IntegerToString.class); @@ -324,4 +333,14 @@ public class FunctionTypeTests { } + private static class MyFunction + implements Function, Flux>, Tuple3, Flux, Flux>> { + + @Override + public Tuple3, Flux, Flux> apply(Tuple2, Flux> t) { + return null; + } + +} + }