Skip to content

Commit 855fd9b

Browse files
christophstroblmp911de
authored andcommitted
Fix serialization issues with default typing in GenericJackson2JsonRedisSerializer.
Closes #2396 Original pull request: #2399.
1 parent 8034cce commit 855fd9b

File tree

2 files changed

+80
-3
lines changed

2 files changed

+80
-3
lines changed

src/main/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializer.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.function.Supplier;
2121

2222
import org.springframework.cache.support.NullValue;
23+
import org.springframework.core.KotlinDetector;
2324
import org.springframework.data.util.Lazy;
2425
import org.springframework.lang.Nullable;
2526
import org.springframework.util.Assert;
@@ -29,7 +30,6 @@
2930
import com.fasterxml.jackson.annotation.JsonTypeInfo;
3031
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
3132
import com.fasterxml.jackson.core.JsonGenerator;
32-
import com.fasterxml.jackson.core.JsonProcessingException;
3333
import com.fasterxml.jackson.core.TreeNode;
3434
import com.fasterxml.jackson.databind.JavaType;
3535
import com.fasterxml.jackson.databind.JsonNode;
@@ -351,7 +351,12 @@ public boolean useForType(JavaType t) {
351351

352352
t = resolveArrayOrWrapper(t);
353353

354-
if (ClassUtils.isPrimitiveOrWrapper(t.getRawClass())) {
354+
if (t.isEnumType() || ClassUtils.isPrimitiveOrWrapper(t.getRawClass())) {
355+
return false;
356+
}
357+
358+
if (t.isFinal() && !KotlinDetector.isKotlinType(t.getRawClass())
359+
&& t.getRawClass().getPackageName().startsWith("java")) {
355360
return false;
356361
}
357362

src/test/java/org/springframework/data/redis/serializer/GenericJackson2JsonRedisSerializerUnitTests.java

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,19 @@
2020
import static org.springframework.test.util.ReflectionTestUtils.*;
2121
import static org.springframework.util.ObjectUtils.*;
2222

23+
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
24+
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
25+
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
26+
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
2327
import lombok.Data;
2428
import lombok.ToString;
2529

2630
import java.io.IOException;
27-
import java.util.concurrent.atomic.AtomicReference;
31+
import java.nio.charset.StandardCharsets;
32+
import java.time.LocalDate;
2833
import java.util.Map;
34+
import java.util.UUID;
35+
import java.util.concurrent.atomic.AtomicReference;
2936

3037
import org.junit.jupiter.api.Test;
3138
import org.mockito.Mockito;
@@ -344,6 +351,61 @@ void includesTypingForWrappedObjectTypes() {
344351
});
345352
}
346353

354+
@Test // GH-2396
355+
void verifySerializeUUIDIntoBytes() {
356+
357+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
358+
359+
UUID source = UUID.fromString("730145fe-324d-4fb1-b12f-60b89a045730");
360+
assertThat(serializer.serialize(source)).isEqualTo(("\"" + source + "\"").getBytes(StandardCharsets.UTF_8));
361+
}
362+
363+
@Test // GH-2396
364+
void deserializesUUIDFromBytes() {
365+
366+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
367+
UUID deserializedUuid = serializer
368+
.deserialize("\"730145fe-324d-4fb1-b12f-60b89a045730\"".getBytes(StandardCharsets.UTF_8), UUID.class);
369+
370+
assertThat(deserializedUuid).isEqualTo(UUID.fromString("730145fe-324d-4fb1-b12f-60b89a045730"));
371+
}
372+
373+
@Test // GH-2396
374+
void serializesEnumIntoBytes() {
375+
376+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
377+
378+
assertThat(serializer.serialize(EnumType.ONE)).isEqualTo(("\"ONE\"").getBytes(StandardCharsets.UTF_8));
379+
}
380+
381+
@Test // GH-2396
382+
void deserializesEnumFromBytes() {
383+
384+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
385+
386+
assertThat(serializer.deserialize("\"TWO\"".getBytes(StandardCharsets.UTF_8), EnumType.class)).isEqualTo(EnumType.TWO);
387+
}
388+
389+
@Test // GH-2396
390+
void serializesJavaTimeIntoBytes() {
391+
392+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
393+
394+
WithJsr310 source = new WithJsr310();
395+
source.myDate = java.time.LocalDate.of(2022,9,2);
396+
397+
assertThat(serializer.serialize(source)).isEqualTo(("{\"@class\":\"org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializerUnitTests$WithJsr310\",\"myDate\":[2022,9,2]}").getBytes(StandardCharsets.UTF_8));
398+
}
399+
400+
@Test // GH-2396
401+
void deserializesJavaTimeFrimBytes() {
402+
403+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
404+
405+
byte[] source = "{\"@class\":\"org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializerUnitTests$WithJsr310\",\"myDate\":[2022,9,2]}".getBytes(StandardCharsets.UTF_8);
406+
assertThat(serializer.deserialize(source, WithJsr310.class).myDate).isEqualTo(java.time.LocalDate.of(2022,9,2));
407+
}
408+
347409
private static void serializeAndDeserializeNullValue(GenericJackson2JsonRedisSerializer serializer) {
348410

349411
NullValue nv = BeanUtils.instantiateClass(NullValue.class);
@@ -464,4 +526,14 @@ static class WithWrapperTypes {
464526
AtomicReference<Integer[]> primitiveArrayWrapper;
465527
AtomicReference<SimpleObject> simpleObjectWrapper;
466528
}
529+
530+
enum EnumType {
531+
ONE, TWO
532+
}
533+
534+
static class WithJsr310 {
535+
@JsonSerialize(using = LocalDateSerializer.class)
536+
@JsonDeserialize(using = LocalDateDeserializer.class)
537+
private LocalDate myDate;
538+
}
467539
}

0 commit comments

Comments
 (0)