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 39dd5cc93..391ec343a 100644 --- a/src/main/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializer.java +++ b/src/main/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializer.java @@ -349,21 +349,33 @@ public class GenericJackson2JsonRedisSerializer implements RedisSerializer(); + source.primitiveArrayWrapper = new AtomicReference<>(new Integer[] { 200, 300 }); + source.simpleObjectWrapper = new AtomicReference<>(); + + byte[] serializedValue = serializer.serialize(source); + + assertThat(new String(serializedValue)) // + .contains("\"primitiveArrayWrapper\":[200,300]") // + .doesNotContain("\"[Ljava.lang.Integer;\""); + + assertThat(serializer.deserialize(serializedValue)) // + .isInstanceOf(WithWrapperTypes.class) // + .satisfies(it -> { + WithWrapperTypes deserialized = (WithWrapperTypes) it; + assertThat(deserialized.primitiveArrayWrapper).hasValue(source.primitiveArrayWrapper.get()); + }); + } + + @Test // GH-2361 + void doesNotIncludeTypingForPrimitiveWrappers() { + + GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); + + WithWrapperTypes source = new WithWrapperTypes(); + source.primitiveWrapper = new AtomicReference<>(123L); + + byte[] serializedValue = serializer.serialize(source); + + assertThat(new String(serializedValue)) // + .contains("\"primitiveWrapper\":123") // + .doesNotContain("\"Ljava.lang.Long;\""); + + assertThat(serializer.deserialize(serializedValue)) // + .isInstanceOf(WithWrapperTypes.class) // + .satisfies(it -> { + WithWrapperTypes deserialized = (WithWrapperTypes) it; + assertThat(deserialized.primitiveWrapper).hasValue(source.primitiveWrapper.get()); + }); + } + + @Test // GH-2361 + void includesTypingForWrappedObjectTypes() { + + GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); + + SimpleObject simpleObject = new SimpleObject(100L); + WithWrapperTypes source = new WithWrapperTypes(); + source.simpleObjectWrapper = new AtomicReference<>(simpleObject); + + byte[] serializedValue = serializer.serialize(source); + + assertThat(new String(serializedValue)) // + .contains( + "\"simpleObjectWrapper\":{\"@class\":\"org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializerUnitTests$SimpleObject\",\"longValue\":100}"); + + assertThat(serializer.deserialize(serializedValue)) // + .isInstanceOf(WithWrapperTypes.class) // + .satisfies(it -> { + WithWrapperTypes deserialized = (WithWrapperTypes) it; + assertThat(deserialized.simpleObjectWrapper).hasValue(source.simpleObjectWrapper.get()); + }); + } + private static void serializeAndDeserializeNullValue(GenericJackson2JsonRedisSerializer serializer) { NullValue nv = BeanUtils.instantiateClass(NullValue.class); @@ -311,7 +393,6 @@ class GenericJackson2JsonRedisSerializerUnitTests { return nullSafeEquals(this.stringValue, other.stringValue) && nullSafeEquals(this.simpleObject, other.simpleObject); } - } @Data @@ -373,5 +454,14 @@ class GenericJackson2JsonRedisSerializerUnitTests { private int count; private int[] available; + private Long[] arrayOfPrimitiveWrapper; + } + + @Data + static class WithWrapperTypes { + + AtomicReference primitiveWrapper; + AtomicReference primitiveArrayWrapper; + AtomicReference simpleObjectWrapper; } }