19
19
import com .fasterxml .jackson .databind .util .ClassUtil ;
20
20
import com .fasterxml .jackson .databind .util .CompactStringObjectMap ;
21
21
import com .fasterxml .jackson .databind .util .EnumResolver ;
22
+ import java .util .Optional ;
22
23
23
24
/**
24
25
* Deserializer class that can deserialize instances of
@@ -53,6 +54,9 @@ public class EnumDeserializer
53
54
54
55
protected final Boolean _caseInsensitive ;
55
56
57
+ private Boolean _useDefaultValueForUnknownEnum ;
58
+ private Boolean _useNullForUnknownEnum ;
59
+
56
60
/**
57
61
* Marker flag for cases where we expect actual integral value for Enum,
58
62
* based on {@code @JsonValue} (and equivalent) annotated accessor.
@@ -77,14 +81,16 @@ public EnumDeserializer(EnumResolver byNameResolver, Boolean caseInsensitive)
77
81
/**
78
82
* @since 2.9
79
83
*/
80
- protected EnumDeserializer (EnumDeserializer base , Boolean caseInsensitive )
84
+ protected EnumDeserializer (EnumDeserializer base , Boolean caseInsensitive , Boolean useDefaultValueForUnknownEnum , Boolean useNullForUnknownEnum )
81
85
{
82
86
super (base );
83
87
_lookupByName = base ._lookupByName ;
84
88
_enumsByIndex = base ._enumsByIndex ;
85
89
_enumDefaultValue = base ._enumDefaultValue ;
86
90
_caseInsensitive = caseInsensitive ;
87
91
_isFromIntValue = base ._isFromIntValue ;
92
+ _useDefaultValueForUnknownEnum = useDefaultValueForUnknownEnum ;
93
+ _useNullForUnknownEnum = useNullForUnknownEnum ;
88
94
}
89
95
90
96
/**
@@ -146,23 +152,26 @@ public static JsonDeserializer<?> deserializerForNoArgsCreator(DeserializationCo
146
152
/**
147
153
* @since 2.9
148
154
*/
149
- public EnumDeserializer withResolved (Boolean caseInsensitive ) {
150
- if (Objects .equals (_caseInsensitive , caseInsensitive )) {
155
+ public EnumDeserializer withResolved (Boolean caseInsensitive , Boolean useDefaultValueForUnknownEnum , Boolean useNullForUnknownEnum ) {
156
+ if (Objects .equals (_caseInsensitive , caseInsensitive )
157
+ && Objects .equals (_useDefaultValueForUnknownEnum , useDefaultValueForUnknownEnum )
158
+ && Objects .equals (_useNullForUnknownEnum , useNullForUnknownEnum )) {
151
159
return this ;
152
160
}
153
- return new EnumDeserializer (this , caseInsensitive );
161
+ return new EnumDeserializer (this , caseInsensitive , useDefaultValueForUnknownEnum , useNullForUnknownEnum );
154
162
}
155
163
156
164
@ Override // since 2.9
157
165
public JsonDeserializer <?> createContextual (DeserializationContext ctxt ,
158
166
BeanProperty property ) throws JsonMappingException
159
167
{
160
- Boolean caseInsensitive = findFormatFeature (ctxt , property , handledType (),
161
- JsonFormat .Feature .ACCEPT_CASE_INSENSITIVE_PROPERTIES );
162
- if (caseInsensitive == null ) {
163
- caseInsensitive = _caseInsensitive ;
164
- }
165
- return withResolved (caseInsensitive );
168
+ Boolean caseInsensitive = Optional .ofNullable (findFormatFeature (ctxt , property , handledType (),
169
+ JsonFormat .Feature .ACCEPT_CASE_INSENSITIVE_PROPERTIES )).orElse (_caseInsensitive );
170
+ Boolean useDefaultValueForUnknownEnum = Optional .ofNullable (findFormatFeature (ctxt , property , handledType (),
171
+ JsonFormat .Feature .READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE )).orElse (_useDefaultValueForUnknownEnum );
172
+ Boolean useNullForUnknownEnum = Optional .ofNullable (findFormatFeature (ctxt , property , handledType (),
173
+ JsonFormat .Feature .READ_UNKNOWN_ENUM_VALUES_AS_NULL )).orElse (_useNullForUnknownEnum );
174
+ return withResolved (caseInsensitive , useDefaultValueForUnknownEnum , useNullForUnknownEnum );
166
175
}
167
176
168
177
/*
@@ -262,11 +271,10 @@ protected Object _fromInteger(JsonParser p, DeserializationContext ctxt,
262
271
if (index >= 0 && index < _enumsByIndex .length ) {
263
272
return _enumsByIndex [index ];
264
273
}
265
- if ((_enumDefaultValue != null )
266
- && ctxt .isEnabled (DeserializationFeature .READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE )) {
274
+ if (useDefaultValueForUnknownEnum (ctxt )) {
267
275
return _enumDefaultValue ;
268
276
}
269
- if (!ctxt . isEnabled ( DeserializationFeature . READ_UNKNOWN_ENUM_VALUES_AS_NULL )) {
277
+ if (!useNullForUnknownEnum ( ctxt )) {
270
278
return ctxt .handleWeirdNumberValue (_enumClass (), index ,
271
279
"index value outside legal index range [0..%s]" ,
272
280
_enumsByIndex .length -1 );
@@ -291,11 +299,10 @@ private final Object _deserializeAltString(JsonParser p, DeserializationContext
291
299
if (name .isEmpty ()) { // empty or blank
292
300
// 07-Jun-2021, tatu: [databind#3171] Need to consider Default value first
293
301
// (alas there's bit of duplication here)
294
- if ((_enumDefaultValue != null )
295
- && ctxt .isEnabled (DeserializationFeature .READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE )) {
302
+ if (useDefaultValueForUnknownEnum (ctxt )) {
296
303
return _enumDefaultValue ;
297
304
}
298
- if (ctxt . isEnabled ( DeserializationFeature . READ_UNKNOWN_ENUM_VALUES_AS_NULL )) {
305
+ if (useNullForUnknownEnum ( ctxt )) {
299
306
return null ;
300
307
}
301
308
@@ -346,11 +353,10 @@ private final Object _deserializeAltString(JsonParser p, DeserializationContext
346
353
}
347
354
}
348
355
}
349
- if ((_enumDefaultValue != null )
350
- && ctxt .isEnabled (DeserializationFeature .READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE )) {
356
+ if (useDefaultValueForUnknownEnum (ctxt )) {
351
357
return _enumDefaultValue ;
352
358
}
353
- if (ctxt . isEnabled ( DeserializationFeature . READ_UNKNOWN_ENUM_VALUES_AS_NULL )) {
359
+ if (useNullForUnknownEnum ( ctxt )) {
354
360
return null ;
355
361
}
356
362
return ctxt .handleWeirdStringValue (_enumClass (), name ,
@@ -384,4 +390,15 @@ protected CompactStringObjectMap _getToStringLookup(DeserializationContext ctxt)
384
390
}
385
391
return lookup ;
386
392
}
393
+
394
+ private boolean useNullForUnknownEnum (DeserializationContext ctxt ) {
395
+ return Boolean .TRUE .equals (_useNullForUnknownEnum )
396
+ || ctxt .isEnabled (DeserializationFeature .READ_UNKNOWN_ENUM_VALUES_AS_NULL );
397
+ }
398
+
399
+ private boolean useDefaultValueForUnknownEnum (DeserializationContext ctxt ) {
400
+ return (_enumDefaultValue != null )
401
+ && (Boolean .TRUE .equals (_useDefaultValueForUnknownEnum )
402
+ || ctxt .isEnabled (DeserializationFeature .READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE ));
403
+ }
387
404
}
0 commit comments