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 476c5e1b264c..379d2aec0dee 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 @@ -256,10 +256,11 @@ protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessa try { writePrefix(generator, object); + Object value = object; Class serializationView = null; FilterProvider filters = null; - Object value = object; JavaType javaType = null; + if (object instanceof MappingJacksonValue) { MappingJacksonValue container = (MappingJacksonValue) object; value = container.getValue(); @@ -269,15 +270,11 @@ protected void writeInternal(Object object, @Nullable Type type, HttpOutputMessa if (type != null && TypeUtils.isAssignable(type, value.getClass())) { javaType = getJavaType(type, null); } - ObjectWriter objectWriter; - if (serializationView != null) { - objectWriter = this.objectMapper.writerWithView(serializationView); - } - else if (filters != null) { - objectWriter = this.objectMapper.writer(filters); - } - else { - objectWriter = this.objectMapper.writer(); + + ObjectWriter objectWriter = (serializationView != null ? + this.objectMapper.writerWithView(serializationView) : this.objectMapper.writer()); + if (filters != null) { + objectWriter = objectWriter.with(filters); } if (javaType != null && javaType.isContainerType()) { objectWriter = objectWriter.forType(javaType); @@ -291,7 +288,6 @@ else if (filters != null) { writeSuffix(generator, object); generator.flush(); - } catch (InvalidDefinitionException ex) { throw new HttpMessageConversionException("Type definition error: " + ex.getType(), ex); diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/AbstractJackson2View.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/AbstractJackson2View.java index 6d43064e9ade..77153f92fe7b 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/AbstractJackson2View.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/view/json/AbstractJackson2View.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.ser.FilterProvider; @@ -205,11 +206,11 @@ protected Object filterAndWrapModel(Map model, HttpServletReques */ protected void writeContent(OutputStream stream, Object object) throws IOException { JsonGenerator generator = this.objectMapper.getFactory().createGenerator(stream, this.encoding); - writePrefix(generator, object); + + Object value = object; Class serializationView = null; FilterProvider filters = null; - Object value = object; if (value instanceof MappingJacksonValue) { MappingJacksonValue container = (MappingJacksonValue) value; @@ -217,15 +218,14 @@ protected void writeContent(OutputStream stream, Object object) throws IOExcepti serializationView = container.getSerializationView(); filters = container.getFilters(); } - if (serializationView != null) { - this.objectMapper.writerWithView(serializationView).writeValue(generator, value); - } - else if (filters != null) { - this.objectMapper.writer(filters).writeValue(generator, value); - } - else { - this.objectMapper.writeValue(generator, value); + + ObjectWriter objectWriter = (serializationView != null ? + this.objectMapper.writerWithView(serializationView) : this.objectMapper.writer()); + if (filters != null) { + objectWriter = objectWriter.with(filters); } + objectWriter.writeValue(generator, value); + writeSuffix(generator, object); generator.flush(); }