Skip to content

Commit c23e1b0

Browse files
committed
feat: create builder class
1 parent 58ef24b commit c23e1b0

File tree

2 files changed

+78
-55
lines changed

2 files changed

+78
-55
lines changed

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

Lines changed: 46 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.io.IOException;
1919
import java.io.Serial;
2020
import java.util.Collections;
21+
import java.util.Objects;
2122
import java.util.function.Consumer;
2223
import java.util.function.Supplier;
2324

@@ -120,39 +121,9 @@ public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName
120121
public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName, JacksonObjectReader reader,
121122
JacksonObjectWriter writer) {
122123

123-
this(classPropertyTypeName, reader, writer, null);
124-
}
125-
126-
/**
127-
* Creates {@link GenericJackson2JsonRedisSerializer} initialized with an {@link ObjectMapper} configured for default
128-
* typing using the given {@link String name} along with the given, required {@link JacksonObjectReader} and
129-
* {@link JacksonObjectWriter} used to read/write {@link Object Objects} de/serialized as JSON,
130-
* optionally customized {@link NullValueSerializer}.
131-
* <p>
132-
* In case {@link String name} is {@literal empty} or {@literal null}, then {@link JsonTypeInfo.Id#CLASS} will be
133-
* used.
134-
* <p>
135-
* In case {@link StdSerializer} is {@literal null}, then a default {@link NullValueSerializer} will be registered.
136-
*
137-
* @param classPropertyTypeName {@link String name} of the JSON property holding type information; can be
138-
* {@literal null}.
139-
* @param reader {@link JacksonObjectReader} function to read objects using {@link ObjectMapper}.
140-
* @param writer {@link JacksonObjectWriter} function to write objects using {@link ObjectMapper}.
141-
* @param nullValueSerializer {@link StdSerializer} to serialize {@link NullValue} instances.
142-
* @see ObjectMapper#activateDefaultTypingAsProperty(PolymorphicTypeValidator, DefaultTyping, String)
143-
* @see ObjectMapper#activateDefaultTyping(PolymorphicTypeValidator, DefaultTyping, As)
144-
* @since 3.3
145-
*/
146-
public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName, JacksonObjectReader reader,
147-
JacksonObjectWriter writer, @Nullable StdSerializer<NullValue> nullValueSerializer) {
148-
149124
this(new ObjectMapper(), reader, writer, classPropertyTypeName);
150125

151-
if (nullValueSerializer == null) {
152-
registerNullValueSerializer(this.mapper, classPropertyTypeName);
153-
} else {
154-
registerCustomNullValueSerializer(nullValueSerializer);
155-
}
126+
registerNullValueSerializer(this.mapper, classPropertyTypeName);
156127

157128
StdTypeResolverBuilder typer = TypeResolverBuilder.forEverything(this.mapper).init(JsonTypeInfo.Id.CLASS, null)
158129
.inclusion(JsonTypeInfo.As.PROPERTY);
@@ -164,6 +135,10 @@ public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName
164135
this.mapper.setDefaultTyping(typer);
165136
}
166137

138+
public static GenericJackson2JsonRedisSerializerBuilder builder() {
139+
return new GenericJackson2JsonRedisSerializerBuilder();
140+
}
141+
167142
/**
168143
* Setting a custom-configured {@link ObjectMapper} is one way to take further control of the JSON serialization
169144
* process. For example, an extended {@link SerializerFactory} can be configured that provides custom serializers for
@@ -261,10 +236,6 @@ public static void registerNullValueSerializer(ObjectMapper objectMapper, @Nulla
261236
objectMapper.registerModule(new SimpleModule().addSerializer(new NullValueSerializer(classPropertyTypeName)));
262237
}
263238

264-
private void registerCustomNullValueSerializer(StdSerializer<NullValue> nullValueSerializer) {
265-
this.mapper.registerModule(new SimpleModule().addSerializer(nullValueSerializer));
266-
}
267-
268239
/**
269240
* Gets the configured {@link ObjectMapper} used internally by this {@link GenericJackson2JsonRedisSerializer} to
270241
* de/serialize {@link Object objects} as {@literal JSON}.
@@ -430,6 +401,46 @@ public void serializeWithType(NullValue value, JsonGenerator jsonGenerator, Seri
430401
}
431402
}
432403

404+
public static class GenericJackson2JsonRedisSerializerBuilder {
405+
private GenericJackson2JsonRedisSerializerBuilder() {}
406+
407+
@Nullable
408+
private String classPropertyTypeName;
409+
private JacksonObjectReader reader;
410+
private JacksonObjectWriter writer;
411+
private ObjectMapper mapper;
412+
413+
public GenericJackson2JsonRedisSerializerBuilder classPropertyTypeName(@Nullable String classPropertyTypeName) {
414+
this.classPropertyTypeName = classPropertyTypeName;
415+
return this;
416+
}
417+
418+
public GenericJackson2JsonRedisSerializerBuilder objectReader(JacksonObjectReader reader) {
419+
this.reader = reader;
420+
return this;
421+
}
422+
423+
public GenericJackson2JsonRedisSerializerBuilder objectWriter(JacksonObjectWriter writer) {
424+
this.writer = writer;
425+
return this;
426+
}
427+
428+
public GenericJackson2JsonRedisSerializerBuilder objectMapper(ObjectMapper mapper) {
429+
this.mapper = mapper;
430+
return this;
431+
}
432+
433+
public GenericJackson2JsonRedisSerializerBuilder registerNullValueSerializer(@Nullable StdSerializer<NullValue> nullValueSerializer) {
434+
this.mapper.registerModule(new SimpleModule().addSerializer(Objects.requireNonNullElseGet(nullValueSerializer, () -> new NullValueSerializer(this.classPropertyTypeName))));
435+
436+
return this;
437+
}
438+
439+
public GenericJackson2JsonRedisSerializer build() {
440+
return new GenericJackson2JsonRedisSerializer(this.mapper, this.reader, this.writer, this.classPropertyTypeName);
441+
}
442+
}
443+
433444
/**
434445
* Custom {@link StdTypeResolverBuilder} that considers typing for non-primitive types. Primitives, their wrappers and
435446
* primitive arrays do not require type hints. The default {@code DefaultTyping#EVERYTHING} typing does not satisfy

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

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -451,30 +451,42 @@ void configureWithNullConsumerThrowsIllegalArgumentException() {
451451
}
452452

453453
@Test
454-
void customSerializeAndDeserializeNullValue() {
454+
void defaultSerializeAndDeserializeNullValueWithBuilderClass() {
455+
GenericJackson2JsonRedisSerializer serializer = GenericJackson2JsonRedisSerializer.builder()
456+
.objectMapper(new ObjectMapper().enableDefaultTyping(DefaultTyping.EVERYTHING, As.PROPERTY))
457+
.objectReader(JacksonObjectReader.create())
458+
.objectWriter(JacksonObjectWriter.create())
459+
.classPropertyTypeName(null)
460+
.registerNullValueSerializer(null)
461+
.build();
455462

456-
GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(
457-
null,
458-
(mapper, source, type) -> {
459-
if (type.getRawClass() == User.class) {
460-
return mapper.readerWithView(Views.Basic.class).forType(type).readValue(source);
463+
serializeAndDeserializeNullValue(serializer);
464+
}
465+
466+
@Test
467+
void customSerializeAndDeserializeNullValueWithBuilderClass() {
468+
GenericJackson2JsonRedisSerializer serializer = GenericJackson2JsonRedisSerializer.builder()
469+
.objectMapper(new ObjectMapper())
470+
.objectReader(JacksonObjectReader.create())
471+
.objectWriter(JacksonObjectWriter.create())
472+
.classPropertyTypeName(null)
473+
.registerNullValueSerializer(new StdSerializer<>(NullValue.class) {
474+
@Override
475+
public void serialize(NullValue nullValue,
476+
JsonGenerator jsonGenerator,
477+
SerializerProvider serializerProvider) throws IOException {
478+
jsonGenerator.writeNull();
461479
}
462-
return mapper.readValue(source, type);
463-
}, JacksonObjectWriter.create(), new StdSerializer<>(NullValue.class) {
464-
@Override
465-
public void serialize(NullValue nullValue,
466-
JsonGenerator jsonGenerator,
467-
SerializerProvider serializerProvider) throws IOException {
468-
jsonGenerator.writeNull();
469-
}
470480

471-
@Override
472-
public void serializeWithType(NullValue value, JsonGenerator jsonGenerator, SerializerProvider serializers,
473-
TypeSerializer typeSerializer) throws IOException {
481+
@Override
482+
public void serializeWithType(NullValue value, JsonGenerator jsonGenerator, SerializerProvider serializers,
483+
TypeSerializer typeSerializer) throws IOException {
484+
485+
serialize(value, jsonGenerator, serializers);
486+
}
487+
})
488+
.build();
474489

475-
serialize(value, jsonGenerator, serializers);
476-
}
477-
});
478490

479491
NullValue nv = BeanUtils.instantiateClass(NullValue.class);
480492

0 commit comments

Comments
 (0)