Fix serialization issues with default typing in GenericJackson2JsonRedisSerializer.

Closes #2396
Original pull request: #2399.
This commit is contained in:
Christoph Strobl
2022-09-02 12:03:33 +02:00
committed by Mark Paluch
parent 6a77187e4b
commit 6b00487d72
2 changed files with 83 additions and 1 deletions

View File

@@ -18,6 +18,7 @@ package org.springframework.data.redis.serializer;
import java.io.IOException;
import org.springframework.cache.support.NullValue;
import org.springframework.core.KotlinDetector;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
@@ -237,7 +238,12 @@ public class GenericJackson2JsonRedisSerializer implements RedisSerializer<Objec
t = resolveArrayOrWrapper(t);
if (ClassUtils.isPrimitiveOrWrapper(t.getRawClass())) {
if (t.isEnumType() || ClassUtils.isPrimitiveOrWrapper(t.getRawClass())) {
return false;
}
if (t.isFinal() && !KotlinDetector.isKotlinType(t.getRawClass())
&& t.getRawClass().getPackage().getName().startsWith("java")) {
return false;
}

View File

@@ -20,9 +20,17 @@ import static org.mockito.Mockito.*;
import static org.springframework.test.util.ReflectionTestUtils.*;
import static org.springframework.util.ObjectUtils.*;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import lombok.Data;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.jupiter.api.Test;
@@ -261,6 +269,65 @@ class GenericJackson2JsonRedisSerializerUnitTests {
});
}
@Test // GH-2396
void verifySerializeUUIDIntoBytes() {
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
UUID source = UUID.fromString("730145fe-324d-4fb1-b12f-60b89a045730");
assertThat(serializer.serialize(source)).isEqualTo(("\"" + source + "\"").getBytes(StandardCharsets.UTF_8));
}
@Test // GH-2396
void deserializesUUIDFromBytes() {
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
UUID deserializedUuid = serializer
.deserialize("\"730145fe-324d-4fb1-b12f-60b89a045730\"".getBytes(StandardCharsets.UTF_8), UUID.class);
assertThat(deserializedUuid).isEqualTo(UUID.fromString("730145fe-324d-4fb1-b12f-60b89a045730"));
}
@Test // GH-2396
void serializesEnumIntoBytes() {
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
assertThat(serializer.serialize(EnumType.ONE)).isEqualTo(("\"ONE\"").getBytes(StandardCharsets.UTF_8));
}
@Test // GH-2396
void deserializesEnumFromBytes() {
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
assertThat(serializer.deserialize("\"TWO\"".getBytes(StandardCharsets.UTF_8), EnumType.class))
.isEqualTo(EnumType.TWO);
}
@Test // GH-2396
void serializesJavaTimeIntoBytes() {
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
WithJsr310 source = new WithJsr310();
source.myDate = java.time.LocalDate.of(2022, 9, 2);
assertThat(serializer.serialize(source)).isEqualTo(
("{\"@class\":\"org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializerUnitTests$WithJsr310\",\"myDate\":[2022,9,2]}")
.getBytes(StandardCharsets.UTF_8));
}
@Test // GH-2396
void deserializesJavaTimeFrimBytes() {
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
byte[] source = "{\"@class\":\"org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializerUnitTests$WithJsr310\",\"myDate\":[2022,9,2]}"
.getBytes(StandardCharsets.UTF_8);
assertThat(serializer.deserialize(source, WithJsr310.class).myDate).isEqualTo(java.time.LocalDate.of(2022, 9, 2));
}
private static void serializeAndDeserializeNullValue(GenericJackson2JsonRedisSerializer serializer) {
NullValue nv = BeanUtils.instantiateClass(NullValue.class);
@@ -366,4 +433,13 @@ class GenericJackson2JsonRedisSerializerUnitTests {
AtomicReference<Integer[]> primitiveArrayWrapper;
AtomicReference<SimpleObject> simpleObjectWrapper;
}
enum EnumType {
ONE, TWO
}
static class WithJsr310 {
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class) private LocalDate myDate;
}
}