Skip to content

Commit 6b00487

Browse files
christophstroblmp911de
authored andcommitted
Fix serialization issues with default typing in GenericJackson2JsonRedisSerializer.
Closes #2396 Original pull request: #2399.
1 parent 6a77187 commit 6b00487

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.io.IOException;
1919

2020
import org.springframework.cache.support.NullValue;
21+
import org.springframework.core.KotlinDetector;
2122
import org.springframework.lang.Nullable;
2223
import org.springframework.util.Assert;
2324
import org.springframework.util.ClassUtils;
@@ -237,7 +238,12 @@ public boolean useForType(JavaType t) {
237238

238239
t = resolveArrayOrWrapper(t);
239240

240-
if (ClassUtils.isPrimitiveOrWrapper(t.getRawClass())) {
241+
if (t.isEnumType() || ClassUtils.isPrimitiveOrWrapper(t.getRawClass())) {
242+
return false;
243+
}
244+
245+
if (t.isFinal() && !KotlinDetector.isKotlinType(t.getRawClass())
246+
&& t.getRawClass().getPackage().getName().startsWith("java")) {
241247
return false;
242248
}
243249

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,17 @@
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

2529
import java.io.IOException;
30+
import java.nio.charset.StandardCharsets;
31+
import java.time.LocalDate;
32+
import java.util.Map;
33+
import java.util.UUID;
2634
import java.util.concurrent.atomic.AtomicReference;
2735

2836
import org.junit.jupiter.api.Test;
@@ -261,6 +269,65 @@ void includesTypingForWrappedObjectTypes() {
261269
});
262270
}
263271

272+
@Test // GH-2396
273+
void verifySerializeUUIDIntoBytes() {
274+
275+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
276+
277+
UUID source = UUID.fromString("730145fe-324d-4fb1-b12f-60b89a045730");
278+
assertThat(serializer.serialize(source)).isEqualTo(("\"" + source + "\"").getBytes(StandardCharsets.UTF_8));
279+
}
280+
281+
@Test // GH-2396
282+
void deserializesUUIDFromBytes() {
283+
284+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
285+
UUID deserializedUuid = serializer
286+
.deserialize("\"730145fe-324d-4fb1-b12f-60b89a045730\"".getBytes(StandardCharsets.UTF_8), UUID.class);
287+
288+
assertThat(deserializedUuid).isEqualTo(UUID.fromString("730145fe-324d-4fb1-b12f-60b89a045730"));
289+
}
290+
291+
@Test // GH-2396
292+
void serializesEnumIntoBytes() {
293+
294+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
295+
296+
assertThat(serializer.serialize(EnumType.ONE)).isEqualTo(("\"ONE\"").getBytes(StandardCharsets.UTF_8));
297+
}
298+
299+
@Test // GH-2396
300+
void deserializesEnumFromBytes() {
301+
302+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
303+
304+
assertThat(serializer.deserialize("\"TWO\"".getBytes(StandardCharsets.UTF_8), EnumType.class))
305+
.isEqualTo(EnumType.TWO);
306+
}
307+
308+
@Test // GH-2396
309+
void serializesJavaTimeIntoBytes() {
310+
311+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
312+
313+
WithJsr310 source = new WithJsr310();
314+
source.myDate = java.time.LocalDate.of(2022, 9, 2);
315+
316+
assertThat(serializer.serialize(source)).isEqualTo(
317+
("{\"@class\":\"org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializerUnitTests$WithJsr310\",\"myDate\":[2022,9,2]}")
318+
.getBytes(StandardCharsets.UTF_8));
319+
}
320+
321+
@Test // GH-2396
322+
void deserializesJavaTimeFrimBytes() {
323+
324+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
325+
326+
byte[] source = "{\"@class\":\"org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializerUnitTests$WithJsr310\",\"myDate\":[2022,9,2]}"
327+
.getBytes(StandardCharsets.UTF_8);
328+
assertThat(serializer.deserialize(source, WithJsr310.class).myDate).isEqualTo(java.time.LocalDate.of(2022, 9, 2));
329+
}
330+
264331
private static void serializeAndDeserializeNullValue(GenericJackson2JsonRedisSerializer serializer) {
265332

266333
NullValue nv = BeanUtils.instantiateClass(NullValue.class);
@@ -366,4 +433,13 @@ static class WithWrapperTypes {
366433
AtomicReference<Integer[]> primitiveArrayWrapper;
367434
AtomicReference<SimpleObject> simpleObjectWrapper;
368435
}
436+
437+
enum EnumType {
438+
ONE, TWO
439+
}
440+
441+
static class WithJsr310 {
442+
@JsonSerialize(using = LocalDateSerializer.class)
443+
@JsonDeserialize(using = LocalDateDeserializer.class) private LocalDate myDate;
444+
}
369445
}

0 commit comments

Comments
 (0)