24
24
import com .fasterxml .jackson .core .JsonEncoding ;
25
25
import com .fasterxml .jackson .core .JsonGenerator ;
26
26
import com .fasterxml .jackson .core .JsonProcessingException ;
27
+ import com .fasterxml .jackson .core .PrettyPrinter ;
27
28
import com .fasterxml .jackson .core .util .DefaultPrettyPrinter ;
28
29
import com .fasterxml .jackson .databind .JavaType ;
29
30
import com .fasterxml .jackson .databind .ObjectMapper ;
@@ -65,6 +66,10 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener
65
66
private static final boolean jackson23Available = ClassUtils .hasMethod (ObjectMapper .class ,
66
67
"canDeserialize" , JavaType .class , AtomicReference .class );
67
68
69
+ // Check for Jackson 2.6+ for support of generic type aware serialization of polymorphic collections
70
+ private static final boolean jackson26Available = ClassUtils .hasMethod (ObjectMapper .class ,
71
+ "setDefaultPrettyPrinter" , PrettyPrinter .class );
72
+
68
73
69
74
protected ObjectMapper objectMapper ;
70
75
@@ -233,15 +238,16 @@ protected void writeInternal(Object object, Type type, HttpOutputMessage outputM
233
238
FilterProvider filters = null ;
234
239
Object value = object ;
235
240
JavaType javaType = null ;
236
- if (type != null ) {
237
- javaType = getJavaType (type , null );
238
- }
239
241
if (object instanceof MappingJacksonValue ) {
240
242
MappingJacksonValue container = (MappingJacksonValue ) object ;
241
243
value = container .getValue ();
242
244
serializationView = container .getSerializationView ();
243
245
filters = container .getFilters ();
244
246
}
247
+ if (jackson26Available && type != null && value != null
248
+ && TypeUtils .isAssignable (type , value .getClass ())) {
249
+ javaType = getJavaType (type , null );
250
+ }
245
251
ObjectWriter objectWriter ;
246
252
if (serializationView != null ) {
247
253
objectWriter = this .objectMapper .writerWithView (serializationView );
@@ -252,7 +258,7 @@ else if (filters != null) {
252
258
else {
253
259
objectWriter = this .objectMapper .writer ();
254
260
}
255
- if (javaType != null && value != null && TypeUtils . isAssignable ( type , value . getClass ()) ) {
261
+ if (javaType != null ) {
256
262
objectWriter = objectWriter .withType (javaType );
257
263
}
258
264
objectWriter .writeValue (generator , value );
0 commit comments