From a44fe4cbe4e2f02260f0dd5b14db6fd390b74e22 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 24 Aug 2018 12:06:52 +0200 Subject: [PATCH] Support Jackson filters in combination with serialization view Issue: SPR-17209 (cherry picked from commit 03f1920106456c76ceddcb7fd486345a4d0de0bb) --- .../AbstractJackson2HttpMessageConverter.java | 18 ++++++--------- .../view/json/AbstractJackson2View.java | 22 +++++++++---------- 2 files changed, 18 insertions(+), 22 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 242f696999..2a40dc6b3f 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 @@ -254,10 +254,11 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener 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(); @@ -267,15 +268,11 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener 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); @@ -289,7 +286,6 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener 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 6d43064e9a..77153f92fe 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.annotation.JsonView; 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 @@ public abstract class AbstractJackson2View extends AbstractView { */ 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 @@ public abstract class AbstractJackson2View extends AbstractView { 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(); }