From 1f4bb973ea02e5c6bf29c1662ab681295e952804 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 6 Dec 2018 09:59:45 +0100 Subject: [PATCH] DATAREDIS-865 - Expose GenericJackson2JsonRedisSerializer.registerNullValueSerializer() for ObjectMapper customization. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now expose registerNullValueSerializer(…) on GenericJackson2JsonRedisSerializer to allow customization of an externally provided ObjectMapper. NullValueSerializer was previously registered only within a constructor that takes classPropertyTypeName and provided no further possibilities to customize ObjectMapper. Code wishing to provide a custom ObjectMapper can now call GenericJackson2JsonRedisSerializer.registerNullValueSerializer(objectMapper, …) and perform additional customizations before using ObjectMapper with GenericJackson2JsonRedisSerializer. Original Pull Request: #376 --- .../GenericJackson2JsonRedisSerializer.java | 23 +++++++++++++++-- ...cJackson2JsonRedisSerializerUnitTests.java | 25 ++++++++++++++++++- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializer.java b/src/main/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializer.java index 5633c95d0..6473f8160 100644 --- a/src/main/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializer.java +++ b/src/main/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializer.java @@ -34,7 +34,10 @@ import com.fasterxml.jackson.databind.ser.SerializerFactory; import com.fasterxml.jackson.databind.ser.std.StdSerializer; /** + * Generic Jackson 2-based {@link RedisSerializer} that maps {@link Object objects} to JSON using dynamic typing. + * * @author Christoph Strobl + * @author Mark Paluch * @since 1.6 */ public class GenericJackson2JsonRedisSerializer implements RedisSerializer { @@ -61,7 +64,7 @@ public class GenericJackson2JsonRedisSerializer implements RedisSerializer { + private static class NullValueSerializer extends StdSerializer { private static final long serialVersionUID = 1999052150548658808L; private final String classIdentifier; diff --git a/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java b/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java index 0d2b8e375..8931219c0 100644 --- a/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java +++ b/src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java @@ -20,6 +20,7 @@ import static org.hamcrest.core.IsInstanceOf.*; import static org.hamcrest.core.IsNull.*; import static org.junit.Assert.*; import static org.mockito.Mockito.*; +import static org.mockito.Mockito.any; import static org.springframework.test.util.ReflectionTestUtils.*; import static org.springframework.util.ObjectUtils.*; @@ -31,15 +32,20 @@ import org.springframework.beans.BeanUtils; import org.springframework.cache.support.NullValue; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeInfo.As; import com.fasterxml.jackson.core.JsonGenerationException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping; import com.fasterxml.jackson.databind.jsontype.TypeResolverBuilder; import com.fasterxml.jackson.databind.type.TypeFactory; /** + * Unit tests for {@link GenericJackson2JsonRedisSerializer}. + * * @author Christoph Strobl + * @author Mark Paluch */ public class GenericJackson2JsonRedisSerializerUnitTests { @@ -122,11 +128,28 @@ public class GenericJackson2JsonRedisSerializerUnitTests { new GenericJackson2JsonRedisSerializer(objectMapperMock).deserialize(new byte[] { 1 }); } - @Test // DATAREDIS-553 + @Test // DATAREDIS-553, DATAREDIS-865 public void shouldSerializeNullValueSoThatItCanBeDeserializedWithDefaultTypingEnabled() { GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); + serializeAndDeserializeNullValue(serializer); + } + + @Test // DATAREDIS-865 + public void shouldSerializeNullValueWithCustomObjectMapper() { + + ObjectMapper mapper = new ObjectMapper(); + mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY); + + GenericJackson2JsonRedisSerializer.registerNullValueSerializer(mapper, null); + GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(mapper); + + serializeAndDeserializeNullValue(serializer); + } + + private static void serializeAndDeserializeNullValue(GenericJackson2JsonRedisSerializer serializer) { + NullValue nv = BeanUtils.instantiateClass(NullValue.class); byte[] serializedValue = serializer.serialize(nv);