|
44 | 44 | import java.util.function.ToLongFunction; |
45 | 45 |
|
46 | 46 | import com.fasterxml.jackson.databind.JsonNode; |
| 47 | +import kotlin.jvm.functions.Function0; |
| 48 | +import kotlin.jvm.functions.Function1; |
47 | 49 | import org.apache.commons.logging.Log; |
48 | 50 | import org.apache.commons.logging.LogFactory; |
49 | 51 | import org.reactivestreams.Publisher; |
|
59 | 61 | import org.springframework.cloud.function.context.config.RoutingFunction; |
60 | 62 | import org.springframework.context.support.GenericApplicationContext; |
61 | 63 | import org.springframework.core.GenericTypeResolver; |
| 64 | +import org.springframework.core.KotlinDetector; |
62 | 65 | import org.springframework.core.ResolvableType; |
63 | 66 | import org.springframework.messaging.Message; |
64 | 67 | import org.springframework.util.Assert; |
@@ -203,25 +206,40 @@ public static Method discoverFunctionalMethod(Class<?> pojoFunctionClass) { |
203 | 206 | } |
204 | 207 |
|
205 | 208 | public static Type discoverFunctionTypeFromClass(Class<?> functionalClass) { |
206 | | - Type t = discoverFunctionTypeFromFunctionMethod(discoverFunctionalMethod(functionalClass)); |
207 | | - if (t == null) { |
208 | | - ResolvableType resolvableFunctionType = ResolvableType.forClass(functionalClass); |
209 | | - List<ResolvableType> resolvedGenerics = new ArrayList<>(); |
210 | | - if (resolvableFunctionType.hasGenerics()) { |
211 | | - for (ResolvableType generic : resolvableFunctionType.getGenerics()) { |
212 | | - if (generic.getType() instanceof TypeVariable) { |
213 | | - resolvedGenerics.add(ResolvableType.forClass(Object.class)); |
214 | | - } |
215 | | - else { |
216 | | - resolvedGenerics.add(generic); |
| 209 | + if (KotlinDetector.isKotlinPresent()) { |
| 210 | + if (Function1.class.isAssignableFrom(functionalClass)) { |
| 211 | + ResolvableType kotlinType = ResolvableType.forClass(functionalClass).as(Function1.class); |
| 212 | + return GenericTypeResolver.resolveType(kotlinType.getType(), functionalClass); |
| 213 | + } |
| 214 | + else if (Function0.class.isAssignableFrom(functionalClass)) { |
| 215 | + ResolvableType kotlinType = ResolvableType.forClass(functionalClass).as(Function0.class); |
| 216 | + return GenericTypeResolver.resolveType(kotlinType.getType(), functionalClass); |
| 217 | + } |
| 218 | + } |
| 219 | + Type typeToReturn = null; |
| 220 | + if (Function.class.isAssignableFrom(functionalClass)) { |
| 221 | + for (Type superInterface : functionalClass.getGenericInterfaces()) { |
| 222 | + if (superInterface != null && !superInterface.equals(Object.class)) { |
| 223 | + if (superInterface.toString().contains("KStream") && ResolvableType.forType(superInterface).getGeneric(1).isArray()) { |
| 224 | + return null; |
217 | 225 | } |
218 | 226 | } |
219 | 227 | } |
220 | | - ResolvableType[] generics = resolvedGenerics.toArray(new ResolvableType[] {}); |
221 | | - |
222 | | - t = ResolvableType.forClassWithGenerics(functionalClass, generics).getType(); |
| 228 | + ResolvableType functionType = ResolvableType.forClass(functionalClass).as(Function.class); |
| 229 | + typeToReturn = GenericTypeResolver.resolveType(functionType.getType(), functionalClass); |
| 230 | + } |
| 231 | + else if (Consumer.class.isAssignableFrom(functionalClass)) { |
| 232 | + ResolvableType functionType = ResolvableType.forClass(functionalClass).as(Consumer.class); |
| 233 | + typeToReturn = GenericTypeResolver.resolveType(functionType.getType(), functionalClass); |
| 234 | + } |
| 235 | + else if (Supplier.class.isAssignableFrom(functionalClass)) { |
| 236 | + ResolvableType functionType = ResolvableType.forClass(functionalClass).as(Supplier.class); |
| 237 | + typeToReturn = GenericTypeResolver.resolveType(functionType.getType(), functionalClass); |
223 | 238 | } |
224 | | - return t; |
| 239 | +// else { |
| 240 | +// typeToReturn = TypeResolver.reify(functionalClass); |
| 241 | +// } |
| 242 | + return typeToReturn; |
225 | 243 | } |
226 | 244 |
|
227 | 245 | /** |
|
0 commit comments