Skip to content

Commit cba9492

Browse files
committed
feat: add custom NullValueSerializer initializer
1 parent 3ab09fb commit cba9492

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public GenericJackson2JsonRedisSerializer() {
9898
* @see ObjectMapper#activateDefaultTyping(PolymorphicTypeValidator, DefaultTyping, As)
9999
*/
100100
public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName) {
101-
this(classPropertyTypeName, JacksonObjectReader.create(), JacksonObjectWriter.create());
101+
this(classPropertyTypeName, JacksonObjectReader.create(), JacksonObjectWriter.create(), null);
102102
}
103103

104104
/**
@@ -118,11 +118,15 @@ public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName
118118
* @since 3.0
119119
*/
120120
public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName, JacksonObjectReader reader,
121-
JacksonObjectWriter writer) {
121+
JacksonObjectWriter writer, @Nullable StdSerializer<NullValue> nullValueSerializer) {
122122

123123
this(new ObjectMapper(), reader, writer, classPropertyTypeName);
124124

125-
registerNullValueSerializer(this.mapper, classPropertyTypeName);
125+
if (nullValueSerializer == null) {
126+
registerNullValueSerializer(this.mapper, classPropertyTypeName);
127+
} else {
128+
registerCustomNullValueSerializer(nullValueSerializer);
129+
}
126130

127131
StdTypeResolverBuilder typer = TypeResolverBuilder.forEverything(this.mapper).init(JsonTypeInfo.Id.CLASS, null)
128132
.inclusion(JsonTypeInfo.As.PROPERTY);
@@ -231,6 +235,10 @@ public static void registerNullValueSerializer(ObjectMapper objectMapper, @Nulla
231235
objectMapper.registerModule(new SimpleModule().addSerializer(new NullValueSerializer(classPropertyTypeName)));
232236
}
233237

238+
private void registerCustomNullValueSerializer(StdSerializer<NullValue> nullValueSerializer) {
239+
this.mapper.registerModule(new SimpleModule().addSerializer(nullValueSerializer));
240+
}
241+
234242
/**
235243
* Gets the configured {@link ObjectMapper} used internally by this {@link GenericJackson2JsonRedisSerializer} to
236244
* de/serialize {@link Object objects} as {@literal JSON}.

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ void shouldConsiderWriter() {
230230
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer((String) null,
231231
JacksonObjectReader.create(), (mapper, source) -> {
232232
return mapper.writerWithView(Views.Basic.class).writeValueAsBytes(source);
233-
});
233+
}, null);
234234

235235
byte[] result = serializer.serialize(user);
236236

@@ -269,7 +269,7 @@ void shouldConsiderReader() {
269269
return mapper.readerWithView(Views.Basic.class).forType(type).readValue(source);
270270
}
271271
return mapper.readValue(source, type);
272-
}, JacksonObjectWriter.create());
272+
}, JacksonObjectWriter.create(), null);
273273

274274
byte[] serializedValue = serializer.serialize(user);
275275

@@ -420,7 +420,7 @@ void deserializesJavaTimeFrimBytes() {
420420
}
421421

422422
@Test // GH-2601
423-
public void internalObjectMapperCustomization() {
423+
void internalObjectMapperCustomization() {
424424

425425
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
426426

@@ -438,14 +438,28 @@ public void internalObjectMapperCustomization() {
438438
}
439439

440440
@Test // GH-2601
441-
public void configureWithNullConsumerThrowsIllegalArgumentException() {
441+
void configureWithNullConsumerThrowsIllegalArgumentException() {
442442

443443
assertThatIllegalArgumentException()
444444
.isThrownBy(() -> new GenericJackson2JsonRedisSerializer().configure(null))
445445
.withMessage("Consumer used to configure and customize ObjectMapper must not be null")
446446
.withNoCause();
447447
}
448448

449+
@Test
450+
void customSerializeAndDeserializeNullValue() {
451+
452+
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
453+
454+
NullValue nv = BeanUtils.instantiateClass(NullValue.class);
455+
456+
byte[] serializedValue = serializer.serialize(nv);
457+
assertThat(serializedValue).isNotNull();
458+
459+
Object deserializedValue = serializer.deserialize(serializedValue);
460+
assertThat(deserializedValue).isInstanceOf(NullValue.class);
461+
}
462+
449463
private static void serializeAndDeserializeNullValue(GenericJackson2JsonRedisSerializer serializer) {
450464

451465
NullValue nv = BeanUtils.instantiateClass(NullValue.class);

0 commit comments

Comments
 (0)