GH-1017 Ensure conversionHint is properly interpreted

Resolves #1017
This commit is contained in:
Oleg Zhurakousky
2023-03-28 09:43:42 +02:00
parent 4a1bfbc764
commit 55eb78190c

View File

@@ -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;
}
}