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; package org.springframework.cloud.function.context.config;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import org.springframework.cloud.function.cloudevent.CloudEventMessageUtils; import org.springframework.cloud.function.cloudevent.CloudEventMessageUtils;
import org.springframework.cloud.function.json.JsonMapper; 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.core.ParameterizedTypeReference;
import org.springframework.lang.Nullable; import org.springframework.lang.Nullable;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
@@ -79,7 +82,7 @@ public class JsonMessageConverter extends AbstractMessageConverter {
if (conversionHint instanceof ParameterizedTypeReference<?>) { if (conversionHint instanceof ParameterizedTypeReference<?>) {
conversionHint = ((ParameterizedTypeReference<?>) conversionHint).getType(); conversionHint = ((ParameterizedTypeReference<?>) conversionHint).getType();
} }
Type convertToType = conversionHint == null ? targetClass : (Type) conversionHint; Type convertToType = this.getResolvedType(targetClass, conversionHint);
if (convertToType == Object.class) { if (convertToType == Object.class) {
return message.getPayload(); return message.getPayload();
} }
@@ -119,4 +122,20 @@ public class JsonMessageConverter extends AbstractMessageConverter {
return jsonMapper.toJson(payload); 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;
}
} }