From 3bff7bd895e47981751c91fbd222710b96315736 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Fri, 26 Jun 2015 02:15:37 +0200 Subject: [PATCH] Serialize with type only with jackson 2.6+ Previous Jackson versions do not serialize polymorphic collections correctly when the type is specified. Issue: SPR-12811 --- .../json/AbstractJackson2HttpMessageConverter.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) 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);