18
18
import java .io .IOException ;
19
19
import java .io .Serial ;
20
20
import java .util .Collections ;
21
+ import java .util .Objects ;
21
22
import java .util .function .Consumer ;
22
23
import java .util .function .Supplier ;
23
24
@@ -120,39 +121,9 @@ public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName
120
121
public GenericJackson2JsonRedisSerializer (@ Nullable String classPropertyTypeName , JacksonObjectReader reader ,
121
122
JacksonObjectWriter writer ) {
122
123
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
-
149
124
this (new ObjectMapper (), reader , writer , classPropertyTypeName );
150
125
151
- if (nullValueSerializer == null ) {
152
- registerNullValueSerializer (this .mapper , classPropertyTypeName );
153
- } else {
154
- registerCustomNullValueSerializer (nullValueSerializer );
155
- }
126
+ registerNullValueSerializer (this .mapper , classPropertyTypeName );
156
127
157
128
StdTypeResolverBuilder typer = TypeResolverBuilder .forEverything (this .mapper ).init (JsonTypeInfo .Id .CLASS , null )
158
129
.inclusion (JsonTypeInfo .As .PROPERTY );
@@ -164,6 +135,10 @@ public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName
164
135
this .mapper .setDefaultTyping (typer );
165
136
}
166
137
138
+ public static GenericJackson2JsonRedisSerializerBuilder builder () {
139
+ return new GenericJackson2JsonRedisSerializerBuilder ();
140
+ }
141
+
167
142
/**
168
143
* Setting a custom-configured {@link ObjectMapper} is one way to take further control of the JSON serialization
169
144
* 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
261
236
objectMapper .registerModule (new SimpleModule ().addSerializer (new NullValueSerializer (classPropertyTypeName )));
262
237
}
263
238
264
- private void registerCustomNullValueSerializer (StdSerializer <NullValue > nullValueSerializer ) {
265
- this .mapper .registerModule (new SimpleModule ().addSerializer (nullValueSerializer ));
266
- }
267
-
268
239
/**
269
240
* Gets the configured {@link ObjectMapper} used internally by this {@link GenericJackson2JsonRedisSerializer} to
270
241
* de/serialize {@link Object objects} as {@literal JSON}.
@@ -430,6 +401,46 @@ public void serializeWithType(NullValue value, JsonGenerator jsonGenerator, Seri
430
401
}
431
402
}
432
403
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
+
433
444
/**
434
445
* Custom {@link StdTypeResolverBuilder} that considers typing for non-primitive types. Primitives, their wrappers and
435
446
* primitive arrays do not require type hints. The default {@code DefaultTyping#EVERYTHING} typing does not satisfy
0 commit comments