From 2d32f8d8ac891672b0f1253ad2145286f1a024f7 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 7 Jun 2022 16:51:51 +0200 Subject: [PATCH] Back-port of https://github.com/spring-cloud/spring-cloud-function/pull/871 --- .../context/catalog/FunctionTypeUtils.java | 9 ++++++-- .../catalog/FunctionTypeUtilsTests.java | 22 ++++++++++++++++++- 2 files changed, 28 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 4b1db374d..b41e3be68 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 @@ -352,10 +352,15 @@ public final class FunctionTypeUtils { type = getImmediateGenericType(type, 0); } - if (type instanceof ParameterizedType && !Message.class.isAssignableFrom(TypeResolver.resolveRawClass(type, null))) { + Class resolveRawClass = FunctionTypeUtils.getRawType(type); + if (type instanceof ParameterizedType && !Message.class.isAssignableFrom(resolveRawClass)) { type = getImmediateGenericType(type, 0); } - return Message.class.isAssignableFrom(TypeResolver.resolveRawClass(type, null)); + resolveRawClass = FunctionTypeUtils.getRawType(type); + if (resolveRawClass == null) { + return false; + } + return Message.class.isAssignableFrom(resolveRawClass); } /** diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtilsTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtilsTests.java index 6f0285422..e295b830e 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtilsTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/catalog/FunctionTypeUtilsTests.java @@ -17,10 +17,13 @@ package org.springframework.cloud.function.context.catalog; +import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.Date; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -32,8 +35,10 @@ import reactor.util.function.Tuple2; import reactor.util.function.Tuple3; import org.springframework.cloud.function.context.FunctionType; +import org.springframework.core.MethodParameter; import org.springframework.core.ParameterizedTypeReference; import org.springframework.messaging.Message; +import org.springframework.util.ReflectionUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -43,7 +48,7 @@ import static org.assertj.core.api.Assertions.assertThat; * */ @SuppressWarnings("unused") -public class FunctionTypeUtilsTests { +public class FunctionTypeUtilsTests { @Test public void testFunctionTypeFrom() throws Exception { @@ -148,6 +153,21 @@ public class FunctionTypeUtilsTests { assertThat(FunctionTypeUtils.isTypeCollection(new ParameterizedTypeReference>>>() { }.getType())).isFalse(); } + @Test + public void testNoNpeFromIsMessage() { + FunctionTypeUtilsTests testService = new FunctionTypeUtilsTests<>(); + + Method methodUnderTest = + ReflectionUtils.findMethod(testService.getClass(), "notAMessageMethod", AtomicReference.class); + MethodParameter methodParameter = MethodParameter.forExecutable(methodUnderTest, 0); + + assertThat(FunctionTypeUtils.isMessage(methodParameter.getGenericParameterType())).isFalse(); + } + + void notAMessageMethod(AtomicReference payload) { + + } + private static Function function() { return null; }