@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user