Skip to content

Commit a747657

Browse files
committed
Try to undo parts of FasterXML#4214, resolves this issue, but requires something wrt original problem
1 parent 149435b commit a747657

File tree

5 files changed

+21
-72
lines changed

5 files changed

+21
-72
lines changed

Diff for: src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -813,8 +813,7 @@ public JsonDeserializer<?> createCollectionDeserializer(DeserializationContext c
813813
if (contentDeser == null) { // not defined by annotation
814814
// One special type: EnumSet:
815815
if (EnumSet.class.isAssignableFrom(collectionClass)) {
816-
deser = new EnumSetDeserializer(contentType, null,
817-
contentTypeDeser);
816+
deser = new EnumSetDeserializer(contentType, null, null);
818817
}
819818
}
820819
}

Diff for: src/main/java/com/fasterxml/jackson/databind/deser/std/EnumSetDeserializer.java

+13-46
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,6 @@ public class EnumSetDeserializer
3232

3333
protected JsonDeserializer<Enum<?>> _enumDeserializer;
3434

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-
4635
/**
4736
* Handler we need for dealing with nulls.
4837
*
@@ -74,11 +63,12 @@ public class EnumSetDeserializer
7463
*/
7564

7665
/**
77-
* @since 2.17
66+
* Main constructor for the deserializer.
67+
*<p>
68+
* NOTE: was temporarily deprecated in 2.17 - 2.18, restored in 2.19
7869
*/
7970
@SuppressWarnings("unchecked" )
80-
public EnumSetDeserializer(JavaType enumType, JsonDeserializer<?> deser,
81-
TypeDeserializer valueTypeDeser)
71+
public EnumSetDeserializer(JavaType enumType, JsonDeserializer<?> deser)
8272
{
8373
super(EnumSet.class);
8474
_enumType = enumType;
@@ -87,19 +77,19 @@ public EnumSetDeserializer(JavaType enumType, JsonDeserializer<?> deser,
8777
throw new IllegalArgumentException("Type "+enumType+" not Java Enum type");
8878
}
8979
_enumDeserializer = (JsonDeserializer<Enum<?>>) deser;
90-
_valueTypeDeserializer = valueTypeDeser;
9180
_unwrapSingle = null;
9281
_nullProvider = null;
9382
_skipNullValues = false;
9483
}
9584

9685
/**
97-
* @deprecated Since 2.17
86+
* @deprecated Since 2.19 (was added in 2.17)
9887
*/
9988
@Deprecated
100-
public EnumSetDeserializer(JavaType enumType, JsonDeserializer<?> deser)
89+
public EnumSetDeserializer(JavaType enumType, JsonDeserializer<?> deser,
90+
TypeDeserializer valueTypeDeser)
10191
{
102-
this(enumType, deser, null);
92+
this(enumType, deser);
10393
}
10494

10595
/**
@@ -121,7 +111,6 @@ protected EnumSetDeserializer(EnumSetDeserializer base,
121111
super(base);
122112
_enumType = base._enumType;
123113
_enumDeserializer = (JsonDeserializer<Enum<?>>) deser;
124-
_valueTypeDeserializer = base._valueTypeDeserializer;
125114
_nullProvider = nuller;
126115
_skipNullValues = NullsConstantProvider.isSkipper(nuller);
127116
_unwrapSingle = unwrapSingle;
@@ -135,29 +124,18 @@ public EnumSetDeserializer withDeserializer(JsonDeserializer<?> deser) {
135124
}
136125

137126
/**
138-
* @since 2.10.1
127+
* @since 2.19
139128
*/
140129
public EnumSetDeserializer withResolved(JsonDeserializer<?> deser,
141-
TypeDeserializer valueTypeDeser,
142130
NullValueProvider nuller, Boolean unwrapSingle) {
143131
if ((Objects.equals(_unwrapSingle, unwrapSingle))
144132
&& (_enumDeserializer == deser)
145-
&& (_valueTypeDeserializer == valueTypeDeser)
146133
&& (_nullProvider == deser)) {
147134
return this;
148135
}
149136
return new EnumSetDeserializer(this, deser, nuller, unwrapSingle);
150137
}
151138

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-
161139
/*
162140
/**********************************************************
163141
/* Basic metadata
@@ -171,9 +149,7 @@ public EnumSetDeserializer withResolved(JsonDeserializer<?> deser,
171149
@Override
172150
public boolean isCachable() {
173151
// One caveat: content deserializer should prevent caching
174-
if ((_enumType.getValueHandler() != null)
175-
// Another: polymorphic deserialization
176-
|| (_valueTypeDeserializer != null)) {
152+
if (_enumType.getValueHandler() != null) {
177153
return false;
178154
}
179155
return true;
@@ -220,12 +196,7 @@ public JsonDeserializer<?> createContextual(DeserializationContext ctxt,
220196
} else { // if directly assigned, probably not yet contextual, so:
221197
deser = ctxt.handleSecondaryContextualization(deser, property, _enumType);
222198
}
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,
199+
return withResolved(deser,
229200
findContentNullProvider(ctxt, property, deser), unwrapSingle);
230201
}
231202

@@ -261,10 +232,8 @@ public EnumSet<?> deserialize(JsonParser p, DeserializationContext ctxt,
261232
protected final EnumSet<?> _deserialize(JsonParser p, DeserializationContext ctxt,
262233
EnumSet result) throws IOException
263234
{
264-
JsonToken t;
265-
final TypeDeserializer typeDeser = _valueTypeDeserializer;
266-
267235
try {
236+
JsonToken t;
268237
while ((t = p.nextToken()) != JsonToken.END_ARRAY) {
269238
// What to do with nulls? Fail or ignore? Fail, for now (note: would fail if we
270239
// passed it to EnumDeserializer, too, but in general nulls should never be passed
@@ -275,10 +244,8 @@ protected final EnumSet<?> _deserialize(JsonParser p, DeserializationContext ctx
275244
continue;
276245
}
277246
value = (Enum<?>) _nullProvider.getNullValue(ctxt);
278-
} else if (typeDeser == null) {
279-
value = _enumDeserializer.deserialize(p, ctxt);
280247
} else {
281-
value = (Enum<?>) _enumDeserializer.deserializeWithType(p, ctxt, typeDeser);
248+
value = _enumDeserializer.deserialize(p, ctxt);
282249
}
283250
if (value != null) {
284251
result.add(value);

Diff for: src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java

+3-21
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public EnumSetSerializer(EnumSetSerializer src,
2626

2727
@Override
2828
public EnumSetSerializer _withValueTypeSerializer(TypeSerializer vts) {
29-
return new EnumSetSerializer(this, _property, vts, _elementSerializer, _unwrapSingle);
29+
// no typing for enum elements (always strongly typed), so don't change
30+
return this;
3031
}
3132

3233
@Override
@@ -47,7 +48,7 @@ public boolean hasSingleElement(EnumSet<? extends Enum<?>> value) {
4748
}
4849

4950
@Override
50-
public final void serialize(EnumSet<? extends Enum<?>> value, JsonGenerator gen,
51+
public void serialize(EnumSet<? extends Enum<?>> value, JsonGenerator gen,
5152
SerializerProvider provider) throws IOException
5253
{
5354
final int len = value.size();
@@ -70,12 +71,6 @@ public void serializeContents(EnumSet<? extends Enum<?>> value, JsonGenerator ge
7071
throws IOException
7172
{
7273
gen.assignCurrentValue(value);
73-
if (_valueTypeSerializer != null) {
74-
// 16-Dec-2024, tatu: As per [databind#4849], need to support polymorphic
75-
// types for elements
76-
_serializeTypedContents(value, gen, provider, _valueTypeSerializer);
77-
return;
78-
}
7974
JsonSerializer<Object> enumSer = _elementSerializer;
8075
// Need to dynamically find instance serializer; unfortunately
8176
// that seems to be the only way to figure out type (no accessors
@@ -87,17 +82,4 @@ public void serializeContents(EnumSet<? extends Enum<?>> value, JsonGenerator ge
8782
enumSer.serialize(en, gen, provider);
8883
}
8984
}
90-
91-
private void _serializeTypedContents(EnumSet<? extends Enum<?>> value, JsonGenerator gen,
92-
SerializerProvider provider, TypeSerializer vts)
93-
throws IOException
94-
{
95-
JsonSerializer<Object> enumSer = _elementSerializer;
96-
for (Enum<?> en : value) {
97-
if (enumSer == null) {
98-
enumSer = provider.findContentValueSerializer(en.getDeclaringClass(), _property);
99-
}
100-
enumSer.serializeWithType(en, gen, provider, vts);
101-
}
102-
}
10385
}

Diff for: src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java renamed to src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetDeserializationWithDefaultTyping4849Test.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.fasterxml.jackson.databind.tofix;
1+
package com.fasterxml.jackson.databind.deser.enums;
22

33
import java.util.EnumSet;
44

Diff for: src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetPolymorphicDeser4214Test.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,14 @@ public void testPolymorphicDeserialization4214() throws Exception
3939
{
4040
// Need to use Default Typing to trigger issue
4141
ObjectMapper mapper = jsonMapperBuilder()
42-
.activateDefaultTyping(BasicPolymorphicTypeValidator.builder().allowIfBaseType(Object.class).build(),
42+
.activateDefaultTyping(BasicPolymorphicTypeValidator.builder()
43+
.allowIfBaseType(Object.class).build(),
4344
DefaultTyping.NON_FINAL_AND_ENUMS)
4445
.build();
4546

4647
EnumSetHolder enumSetHolder = new EnumSetHolder();
4748
enumSetHolder.enumSet = EnumSet.allOf(MyEnum.class);
48-
String json = mapper.writeValueAsString(enumSetHolder);
49+
String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(enumSetHolder);
4950
EnumSetHolder result = mapper.readValue(json, EnumSetHolder.class);
5051
assertEquals(result, enumSetHolder);
5152
}

0 commit comments

Comments
 (0)