diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/JsonMessageConverter.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/JsonMessageConverter.java index 6b9351b16..5e9c068fe 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/JsonMessageConverter.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/JsonMessageConverter.java @@ -16,11 +16,14 @@ package org.springframework.cloud.function.context.config; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import org.springframework.cloud.function.cloudevent.CloudEventMessageUtils; import org.springframework.cloud.function.json.JsonMapper; +import org.springframework.core.GenericTypeResolver; +import org.springframework.core.MethodParameter; import org.springframework.core.ParameterizedTypeReference; import org.springframework.lang.Nullable; import org.springframework.messaging.Message; @@ -79,7 +82,7 @@ public class JsonMessageConverter extends AbstractMessageConverter { if (conversionHint instanceof ParameterizedTypeReference) { conversionHint = ((ParameterizedTypeReference) conversionHint).getType(); } - Type convertToType = conversionHint == null ? targetClass : (Type) conversionHint; + Type convertToType = this.getResolvedType(targetClass, conversionHint); if (convertToType == Object.class) { return message.getPayload(); } @@ -119,4 +122,20 @@ public class JsonMessageConverter extends AbstractMessageConverter { return jsonMapper.toJson(payload); } + private Type getResolvedType(Class targetClass, @Nullable Object conversionHint) { + if (conversionHint instanceof MethodParameter param) { + param = param.nestedIfOptional(); + if (Message.class.isAssignableFrom(param.getParameterType())) { + param = param.nested(); + } + Type genericParameterType = param.getNestedGenericParameterType(); + Class contextClass = param.getContainingClass(); + return GenericTypeResolver.resolveType(genericParameterType, contextClass); + } + else if (conversionHint instanceof ParameterizedType) { + return (Type) conversionHint; + } + return targetClass; + } + }