MappingJackson2MessageConverter uses generic type

Issue: SPR-16252
This commit is contained in:
Rossen Stoyanchev
2017-12-12 22:32:33 -05:00
parent f05175586e
commit 583201b02c
2 changed files with 42 additions and 3 deletions

View File

@@ -37,7 +37,9 @@ import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.MethodParameter;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
@@ -207,7 +209,7 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter {
@Override
@Nullable
protected Object convertFromInternal(Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) {
JavaType javaType = this.objectMapper.constructType(targetClass);
JavaType javaType = getJavaType(targetClass, conversionHint);
Object payload = message.getPayload();
Class<?> view = getSerializationView(conversionHint);
// Note: in the view case, calling withType instead of forType for compatibility with Jackson <2.5
@@ -234,6 +236,18 @@ public class MappingJackson2MessageConverter extends AbstractMessageConverter {
}
}
private JavaType getJavaType(Class<?> targetClass, @Nullable Object conversionHint) {
if (conversionHint instanceof MethodParameter) {
MethodParameter param = (MethodParameter) conversionHint;
param = param.nestedIfOptional();
Type genericParameterType = param.getNestedGenericParameterType();
Class<?> contextClass = param.getContainingClass();
Type type = GenericTypeResolver.resolveType(genericParameterType, contextClass);
return this.objectMapper.getTypeFactory().constructType(type);
}
return this.objectMapper.constructType(targetClass);
}
@Override
@Nullable
protected Object convertToInternal(Object payload, @Nullable MessageHeaders headers,