diff --git a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java index de9e2edfa8..320b10346a 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/json/AbstractJackson2HttpMessageConverter.java @@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicReference; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.PrettyPrinter; import com.fasterxml.jackson.core.util.DefaultPrettyPrinter; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; @@ -65,6 +66,10 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener private static final boolean jackson23Available = ClassUtils.hasMethod(ObjectMapper.class, "canDeserialize", JavaType.class, AtomicReference.class); + // Check for Jackson 2.6+ for support of generic type aware serialization of polymorphic collections + private static final boolean jackson26Available = ClassUtils.hasMethod(ObjectMapper.class, + "setDefaultPrettyPrinter", PrettyPrinter.class); + protected ObjectMapper objectMapper; @@ -233,15 +238,16 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener FilterProvider filters = null; Object value = object; JavaType javaType = null; - if (type != null) { - javaType = getJavaType(type, null); - } if (object instanceof MappingJacksonValue) { MappingJacksonValue container = (MappingJacksonValue) object; value = container.getValue(); serializationView = container.getSerializationView(); filters = container.getFilters(); } + if (jackson26Available && type != null && value != null + && TypeUtils.isAssignable(type, value.getClass())) { + javaType = getJavaType(type, null); + } ObjectWriter objectWriter; if (serializationView != null) { objectWriter = this.objectMapper.writerWithView(serializationView); @@ -252,7 +258,7 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener else { objectWriter = this.objectMapper.writer(); } - if (javaType != null && value != null && TypeUtils.isAssignable(type, value.getClass())) { + if (javaType != null) { objectWriter = objectWriter.withType(javaType); } objectWriter.writeValue(generator, value);