@@ -26,12 +26,23 @@ public class EnumSetDeserializer
26
26
extends StdDeserializer <EnumSet <?>>
27
27
implements ContextualDeserializer
28
28
{
29
- private static final long serialVersionUID = 1L ; // since 2.5
29
+ private static final long serialVersionUID = 2L ; // since 2.17
30
30
31
31
protected final JavaType _enumType ;
32
32
33
33
protected JsonDeserializer <Enum <?>> _enumDeserializer ;
34
34
35
+ /**
36
+ * If element instances have polymorphic type information, this
37
+ * is the type deserializer that can handle it.
38
+ *<p>
39
+ * NOTE: only added in 2.17 due to new {@code DefaultType} choices
40
+ * that allow polymorphic deserialization of {@code Enum} types.
41
+ *
42
+ * @since 2.17
43
+ */
44
+ protected final TypeDeserializer _valueTypeDeserializer ;
45
+
35
46
/**
36
47
* Handler we need for dealing with nulls.
37
48
*
@@ -62,8 +73,12 @@ public class EnumSetDeserializer
62
73
/**********************************************************
63
74
*/
64
75
76
+ /**
77
+ * @since 2.17
78
+ */
65
79
@ SuppressWarnings ("unchecked" )
66
- public EnumSetDeserializer (JavaType enumType , JsonDeserializer <?> deser )
80
+ public EnumSetDeserializer (JavaType enumType , JsonDeserializer <?> deser ,
81
+ TypeDeserializer valueTypeDeser )
67
82
{
68
83
super (EnumSet .class );
69
84
_enumType = enumType ;
@@ -72,11 +87,21 @@ public EnumSetDeserializer(JavaType enumType, JsonDeserializer<?> deser)
72
87
throw new IllegalArgumentException ("Type " +enumType +" not Java Enum type" );
73
88
}
74
89
_enumDeserializer = (JsonDeserializer <Enum <?>>) deser ;
90
+ _valueTypeDeserializer = valueTypeDeser ;
75
91
_unwrapSingle = null ;
76
92
_nullProvider = null ;
77
93
_skipNullValues = false ;
78
94
}
79
95
96
+ /**
97
+ * @deprecated Since 2.17
98
+ */
99
+ @ Deprecated
100
+ public EnumSetDeserializer (JavaType enumType , JsonDeserializer <?> deser )
101
+ {
102
+ this (enumType , deser , null );
103
+ }
104
+
80
105
/**
81
106
* @since 2.7
82
107
* @deprecated Since 2.10.1
@@ -96,6 +121,7 @@ protected EnumSetDeserializer(EnumSetDeserializer base,
96
121
super (base );
97
122
_enumType = base ._enumType ;
98
123
_enumDeserializer = (JsonDeserializer <Enum <?>>) deser ;
124
+ _valueTypeDeserializer = base ._valueTypeDeserializer ;
99
125
_nullProvider = nuller ;
100
126
_skipNullValues = NullsConstantProvider .isSkipper (nuller );
101
127
_unwrapSingle = unwrapSingle ;
@@ -108,22 +134,30 @@ public EnumSetDeserializer withDeserializer(JsonDeserializer<?> deser) {
108
134
return new EnumSetDeserializer (this , deser , _nullProvider , _unwrapSingle );
109
135
}
110
136
111
- @ Deprecated // since 2.10.1
112
- public EnumSetDeserializer withResolved (JsonDeserializer <?> deser , Boolean unwrapSingle ) {
113
- return withResolved (deser , _nullProvider , unwrapSingle );
114
- }
115
-
116
137
/**
117
138
* @since 2.10.1
118
139
*/
119
- public EnumSetDeserializer withResolved (JsonDeserializer <?> deser , NullValueProvider nuller ,
120
- Boolean unwrapSingle ) {
121
- if ((Objects .equals (_unwrapSingle , unwrapSingle )) && (_enumDeserializer == deser ) && (_nullProvider == deser )) {
140
+ public EnumSetDeserializer withResolved (JsonDeserializer <?> deser ,
141
+ TypeDeserializer valueTypeDeser ,
142
+ NullValueProvider nuller , Boolean unwrapSingle ) {
143
+ if ((Objects .equals (_unwrapSingle , unwrapSingle ))
144
+ && (_enumDeserializer == deser )
145
+ && (_valueTypeDeserializer == valueTypeDeser )
146
+ && (_nullProvider == deser )) {
122
147
return this ;
123
148
}
124
149
return new EnumSetDeserializer (this , deser , nuller , unwrapSingle );
125
150
}
126
151
152
+ /**
153
+ * @deprecated Since 2.17
154
+ */
155
+ @ Deprecated
156
+ public EnumSetDeserializer withResolved (JsonDeserializer <?> deser ,
157
+ NullValueProvider nuller , Boolean unwrapSingle ) {
158
+ return withResolved (deser , _valueTypeDeserializer , nuller , unwrapSingle );
159
+ }
160
+
127
161
/*
128
162
/**********************************************************
129
163
/* Basic metadata
@@ -137,12 +171,14 @@ public EnumSetDeserializer withResolved(JsonDeserializer<?> deser, NullValueProv
137
171
@ Override
138
172
public boolean isCachable () {
139
173
// One caveat: content deserializer should prevent caching
140
- if (_enumType .getValueHandler () != null ) {
174
+ if ((_enumType .getValueHandler () != null )
175
+ // Another: polymorphic deserialization
176
+ || (_valueTypeDeserializer != null )) {
141
177
return false ;
142
178
}
143
179
return true ;
144
180
}
145
-
181
+
146
182
@ Override // since 2.12
147
183
public LogicalType logicalType () {
148
184
return LogicalType .Collection ;
@@ -184,7 +220,13 @@ public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
184
220
} else { // if directly assigned, probably not yet contextual, so:
185
221
deser = ctxt .handleSecondaryContextualization (deser , property , _enumType );
186
222
}
187
- return withResolved (deser , findContentNullProvider (ctxt , property , deser ), unwrapSingle );
223
+ // and finally, type deserializer needs context as well
224
+ TypeDeserializer valueTypeDeser = _valueTypeDeserializer ;
225
+ if (valueTypeDeser != null ) {
226
+ valueTypeDeser = valueTypeDeser .forProperty (property );
227
+ }
228
+ return withResolved (deser , valueTypeDeser ,
229
+ findContentNullProvider (ctxt , property , deser ), unwrapSingle );
188
230
}
189
231
190
232
/*
@@ -220,6 +262,7 @@ protected final EnumSet<?> _deserialize(JsonParser p, DeserializationContext ctx
220
262
EnumSet result ) throws IOException
221
263
{
222
264
JsonToken t ;
265
+ final TypeDeserializer typeDeser = _valueTypeDeserializer ;
223
266
224
267
try {
225
268
while ((t = p .nextToken ()) != JsonToken .END_ARRAY ) {
@@ -232,8 +275,10 @@ protected final EnumSet<?> _deserialize(JsonParser p, DeserializationContext ctx
232
275
continue ;
233
276
}
234
277
value = (Enum <?>) _nullProvider .getNullValue (ctxt );
235
- } else {
278
+ } else if ( typeDeser == null ) {
236
279
value = _enumDeserializer .deserialize (p , ctxt );
280
+ } else {
281
+ value = (Enum <?>) _enumDeserializer .deserializeWithType (p , ctxt , typeDeser );
237
282
}
238
283
if (value != null ) {
239
284
result .add (value );
0 commit comments