Fix serialization issues with default typing in GenericJackson2JsonRedisSerializer.
Closes #2396 Original pull request: #2399.
This commit is contained in:
committed by
Mark Paluch
parent
8034cce7cb
commit
855fd9be5a
@@ -20,6 +20,7 @@ import java.util.Collections;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import org.springframework.cache.support.NullValue;
|
||||
import org.springframework.core.KotlinDetector;
|
||||
import org.springframework.data.util.Lazy;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
@@ -29,7 +30,6 @@ import org.springframework.util.StringUtils;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.TreeNode;
|
||||
import com.fasterxml.jackson.databind.JavaType;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
@@ -351,7 +351,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().getPackageName().startsWith("java")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,12 +20,19 @@ 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 lombok.ToString;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
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;
|
||||
import org.mockito.Mockito;
|
||||
@@ -344,6 +351,61 @@ 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);
|
||||
@@ -464,4 +526,14 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user