From 585072a1b7836df8ce4c8478d851610c46318a30 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 19 Jun 2017 14:53:03 +0200 Subject: [PATCH] DATAREST-1060 - Improve AssociationOmittingSerializerModifier to not break on Jackson 2.9. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit According to this upstream ticket [0] we need to override BeanSerializerModifier.changeProperties(…) rather than ….updateBuilder(…). The commit just does that. [0] https://github.com/FasterXML/jackson-databind/issues/1664 Related ticket: FasterXML/jackson-databind#1664 --- .../json/PersistentEntityJackson2Module.java | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/PersistentEntityJackson2Module.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/PersistentEntityJackson2Module.java index 4e45349c0..f4c1cd8f5 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/PersistentEntityJackson2Module.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/json/PersistentEntityJackson2Module.java @@ -84,7 +84,6 @@ import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; import com.fasterxml.jackson.databind.jsontype.TypeSerializer; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.BeanPropertyWriter; -import com.fasterxml.jackson.databind.ser.BeanSerializerBuilder; import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer; @@ -237,64 +236,63 @@ public class PersistentEntityJackson2Module extends SimpleModule { /* * (non-Javadoc) - * @see com.fasterxml.jackson.databind.ser.BeanSerializerModifier#updateBuilder(com.fasterxml.jackson.databind.SerializationConfig, com.fasterxml.jackson.databind.BeanDescription, com.fasterxml.jackson.databind.ser.BeanSerializerBuilder) + * @see com.fasterxml.jackson.databind.ser.BeanSerializerModifier#changeProperties(com.fasterxml.jackson.databind.SerializationConfig, com.fasterxml.jackson.databind.BeanDescription, java.util.List) */ @Override - public BeanSerializerBuilder updateBuilder(SerializationConfig config, BeanDescription beanDesc, - BeanSerializerBuilder builder) { + public List changeProperties(SerializationConfig config, BeanDescription beanDesc, + List beanProperties) { - entities.getPersistentEntity(beanDesc.getBeanClass()).ifPresent(entity -> { + return entities.getPersistentEntity(beanDesc.getBeanClass()).map(entity -> { List result = new ArrayList(); - for (BeanPropertyWriter writer : builder.getProperties()) { + for (BeanPropertyWriter writer : beanProperties) { Optional> findProperty = findProperty(writer.getName(), entity, beanDesc); - findProperty.ifPresent(it -> { + if (!findProperty.isPresent()) { + result.add(writer); + continue; + } + + findProperty.flatMap(it -> { if (associations.isLookupType(it)) { LOG.debug("Assigning lookup object serializer for {}.", it); writer.assignSerializer(lookupObjectSerializer); - result.add(writer); - return; + + return Optional.of(writer); } // Is there a default projection? if (associations.isLinkableAssociation(it)) { - return; + return Optional.empty(); } // Skip ids unless explicitly configured to expose if (it.isIdProperty() && !associations.isIdExposed(entity)) { - return; + return Optional.empty(); } if (it.isVersionProperty()) { - return; + return Optional.empty(); } if (it.isEntity() && !writer.isUnwrapping()) { - LOG.debug("Assigning nested entity serializer for {}.", it); - writer.assignSerializer(nestedEntitySerializer); } - result.add(writer); - }); + return Optional.of(writer); - if (!findProperty.isPresent()) { - result.add(writer); - } + }).ifPresent(result::add); } - builder.setProperties(result); - }); + return result; - return builder; + }).orElse(beanProperties); } /**