From 8daa2aae15b53c3e9ddaf0fae9831140509a0bc7 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 18 Oct 2024 20:22:40 +0200 Subject: [PATCH] GH-1073 Fix Kotlin type resolution Resolves #1073 --- .../function/context/catalog/FunctionTypeUtils.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java index 24e181e12..d25d985f4 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtils.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; @@ -192,7 +193,12 @@ public final class FunctionTypeUtils { public static Type discoverFunctionTypeFromClass(Class functionalClass) { if (KotlinDetector.isKotlinPresent()) { if (Function1.class.isAssignableFrom(functionalClass)) { - return TypeResolver.reify(Function1.class, (Class>) functionalClass); + try { + return TypeResolver.reify(Function1.class, (Class>) functionalClass); + } + catch (Exception e) { + return discoverFunctionTypeFromFunctionMethod(discoverFunctionalMethod(functionalClass)); + } } else if (Function0.class.isAssignableFrom(functionalClass)) { return TypeResolver.reify(Function0.class, (Class>) functionalClass); @@ -252,10 +258,11 @@ public final class FunctionTypeUtils { Assert.isTrue( functionMethod.getName().equals("apply") || functionMethod.getName().equals("accept") || - functionMethod.getName().equals("get"), + functionMethod.getName().equals("get") || + functionMethod.getName().equals("invoke"), "Only Supplier, Function or Consumer supported at the moment. Was " + functionMethod.getDeclaringClass()); - if (functionMethod.getName().equals("apply")) { + if (functionMethod.getName().equals("apply") || functionMethod.getName().equals("invoke")) { return ResolvableType.forClassWithGenerics(Function.class, ResolvableType.forMethodParameter(functionMethod, 0), ResolvableType.forMethodReturnType(functionMethod)).getType();