Support Jackson filters in combination with serialization view

Issue: SPR-17209
This commit is contained in:
Juergen Hoeller 2018-08-24 12:06:52 +02:00
parent 7056808716
commit 03f1920106
2 changed files with 18 additions and 22 deletions

View File

@ -256,10 +256,11 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener
try { try {
writePrefix(generator, object); writePrefix(generator, object);
Object value = object;
Class<?> serializationView = null; Class<?> serializationView = null;
FilterProvider filters = null; FilterProvider filters = null;
Object value = object;
JavaType javaType = null; JavaType javaType = null;
if (object instanceof MappingJacksonValue) { if (object instanceof MappingJacksonValue) {
MappingJacksonValue container = (MappingJacksonValue) object; MappingJacksonValue container = (MappingJacksonValue) object;
value = container.getValue(); value = container.getValue();
@ -269,15 +270,11 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener
if (type != null && TypeUtils.isAssignable(type, value.getClass())) { if (type != null && TypeUtils.isAssignable(type, value.getClass())) {
javaType = getJavaType(type, null); javaType = getJavaType(type, null);
} }
ObjectWriter objectWriter;
if (serializationView != null) { ObjectWriter objectWriter = (serializationView != null ?
objectWriter = this.objectMapper.writerWithView(serializationView); this.objectMapper.writerWithView(serializationView) : this.objectMapper.writer());
} if (filters != null) {
else if (filters != null) { objectWriter = objectWriter.with(filters);
objectWriter = this.objectMapper.writer(filters);
}
else {
objectWriter = this.objectMapper.writer();
} }
if (javaType != null && javaType.isContainerType()) { if (javaType != null && javaType.isContainerType()) {
objectWriter = objectWriter.forType(javaType); objectWriter = objectWriter.forType(javaType);
@ -291,7 +288,6 @@ public abstract class AbstractJackson2HttpMessageConverter extends AbstractGener
writeSuffix(generator, object); writeSuffix(generator, object);
generator.flush(); generator.flush();
} }
catch (InvalidDefinitionException ex) { catch (InvalidDefinitionException ex) {
throw new HttpMessageConversionException("Type definition error: " + ex.getType(), ex); throw new HttpMessageConversionException("Type definition error: " + ex.getType(), ex);

View File

@ -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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.JsonEncoding;
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.ser.FilterProvider; 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 { protected void writeContent(OutputStream stream, Object object) throws IOException {
JsonGenerator generator = this.objectMapper.getFactory().createGenerator(stream, this.encoding); JsonGenerator generator = this.objectMapper.getFactory().createGenerator(stream, this.encoding);
writePrefix(generator, object); writePrefix(generator, object);
Object value = object;
Class<?> serializationView = null; Class<?> serializationView = null;
FilterProvider filters = null; FilterProvider filters = null;
Object value = object;
if (value instanceof MappingJacksonValue) { if (value instanceof MappingJacksonValue) {
MappingJacksonValue container = (MappingJacksonValue) value; MappingJacksonValue container = (MappingJacksonValue) value;
@ -217,15 +218,14 @@ public abstract class AbstractJackson2View extends AbstractView {
serializationView = container.getSerializationView(); serializationView = container.getSerializationView();
filters = container.getFilters(); filters = container.getFilters();
} }
if (serializationView != null) {
this.objectMapper.writerWithView(serializationView).writeValue(generator, value); ObjectWriter objectWriter = (serializationView != null ?
} this.objectMapper.writerWithView(serializationView) : this.objectMapper.writer());
else if (filters != null) { if (filters != null) {
this.objectMapper.writer(filters).writeValue(generator, value); objectWriter = objectWriter.with(filters);
}
else {
this.objectMapper.writeValue(generator, value);
} }
objectWriter.writeValue(generator, value);
writeSuffix(generator, object); writeSuffix(generator, object);
generator.flush(); generator.flush();
} }