From 5fe309933184f60d20e437b9de9213406f1a47f2 Mon Sep 17 00:00:00 2001 From: joohyukkim Date: Tue, 17 Dec 2024 01:13:25 +0900 Subject: [PATCH 01/10] fix issue 4849 --- release-notes/VERSION-2.x | 3 + .../impl/AsArrayTypeDeserializer.java | 5 ++ ...erializationWithDefaultTyping4849Test.java | 83 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index c38ca1aecf..3661c8628f 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -12,6 +12,9 @@ Project: jackson-databind (fix by Joo-Hyuk K) #4844: Fix wrapped array hanlding wrt `null` by `StdDeserializer` (fix by Stanislav S) +#4849 Not able to deserialize Enum with default typing after upgrading 2.15.4 -> 2.17.1 + (reported by Kornel Zemla) + (fix by Joo-Hyuk K) 2.18.2 (27-Nov-2024) diff --git a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java index af2af513a6..53194cf602 100644 --- a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java @@ -146,6 +146,11 @@ protected String _locateTypeId(JsonParser p, DeserializationContext ctxt) throws +ClassUtil.classNameOf(_idResolver)+") returned `null`"); } return id; + } + // [databind#4849] Since 2.18.3, Should maybe allow defaultTyping without defaultImpl if type is already known + String id = _idResolver.idFromBaseType(); + if (id != null && _baseType.isConcrete()) { + return id; } ctxt.reportWrongTokenException(baseType(), JsonToken.START_ARRAY, "need Array value to contain `As.WRAPPER_ARRAY` type information for class "+baseTypeName()); diff --git a/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java b/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java new file mode 100644 index 0000000000..5c7df3059d --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java @@ -0,0 +1,83 @@ +package com.fasterxml.jackson.databind.tofix; + +import java.util.EnumSet; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator; +import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator; +import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder; + +import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY; +import static com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping.NON_FINAL; +import static com.fasterxml.jackson.databind.testutil.DatabindTestUtil.newJsonMapper; +import static org.junit.jupiter.api.Assertions.assertEquals; + +// [databind#4849] Not able to deserialize Enum with default typing after upgrading 2.15.4 -> 2.17.1 +public class EnumSetDeserializationWithDefaultTyping4849Test +{ + public enum TestEnum4849 { + TEST_ENUM_VALUE + } + + private final ObjectMapper MAPPER = configureMapper4849(); + + private ObjectMapper configureMapper4849() + { + ObjectMapper mapper = newJsonMapper(); + + final PolymorphicTypeValidator validator = BasicPolymorphicTypeValidator.builder() + .allowIfSubType("com.fasterxml.jackson") + .allowIfSubType("java") + .build(); + + ObjectMapper.DefaultTypeResolverBuilder resolverBuilder + = new ObjectMapper.DefaultTypeResolverBuilder(NON_FINAL, validator) { + + @Override + public boolean useForType(JavaType t) { + return true; + } + }; + + StdTypeResolverBuilder stdTypeResolverBuilder = resolverBuilder + .init(JsonTypeInfo.Id.CLASS, null) + .inclusion(PROPERTY); + + mapper.setDefaultTyping(stdTypeResolverBuilder); + mapper.configure(JsonParser.Feature.INCLUDE_SOURCE_IN_LOCATION, true); + + return mapper; + } + + @Test + public void testSerializationDeserializationRoundTrip4849() + throws Exception + { + // Given + EnumSet input = EnumSet.of(TestEnum4849.TEST_ENUM_VALUE); + // When : Serialize and deserialize + String inputJson = MAPPER.writeValueAsString(input); + Object inputDeserialized = MAPPER.readValue(inputJson, Object.class); + // Then + assertEquals(input, inputDeserialized); + } + + @Test + public void testHardCodedDeserializationFromPreviousJackson4849() + throws Exception + { + // Given : Hard-coded output from Jackson 2.15.4 + String array = String.format("[\"java.util.EnumSet<%s>\",[\"%s\"]]", + TestEnum4849.class.getName(), + TestEnum4849.TEST_ENUM_VALUE.name()); + // When + Object deserialized = MAPPER.readValue(array, Object.class); + // Then + assertEquals(EnumSet.of(TestEnum4849.TEST_ENUM_VALUE), deserialized); + } +} From ffc27261ad94e7a520f86e8f67716ce7b76dd8b4 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Mon, 16 Dec 2024 21:26:22 -0800 Subject: [PATCH 02/10] tiny changes to test to ease merging --- ...erializationWithDefaultTyping4849Test.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java b/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java index 5c7df3059d..5173940547 100644 --- a/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java @@ -5,22 +5,24 @@ import org.junit.jupiter.api.Test; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.core.JsonParser; + import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator; import com.fasterxml.jackson.databind.jsontype.PolymorphicTypeValidator; import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder; +import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY; import static com.fasterxml.jackson.databind.ObjectMapper.DefaultTyping.NON_FINAL; -import static com.fasterxml.jackson.databind.testutil.DatabindTestUtil.newJsonMapper; + import static org.junit.jupiter.api.Assertions.assertEquals; // [databind#4849] Not able to deserialize Enum with default typing after upgrading 2.15.4 -> 2.17.1 public class EnumSetDeserializationWithDefaultTyping4849Test + extends DatabindTestUtil { - public enum TestEnum4849 { + enum TestEnum4849 { TEST_ENUM_VALUE } @@ -28,16 +30,14 @@ public enum TestEnum4849 { private ObjectMapper configureMapper4849() { - ObjectMapper mapper = newJsonMapper(); - final PolymorphicTypeValidator validator = BasicPolymorphicTypeValidator.builder() .allowIfSubType("com.fasterxml.jackson") .allowIfSubType("java") .build(); + @SuppressWarnings("serial") ObjectMapper.DefaultTypeResolverBuilder resolverBuilder = new ObjectMapper.DefaultTypeResolverBuilder(NON_FINAL, validator) { - @Override public boolean useForType(JavaType t) { return true; @@ -48,10 +48,9 @@ public boolean useForType(JavaType t) { .init(JsonTypeInfo.Id.CLASS, null) .inclusion(PROPERTY); - mapper.setDefaultTyping(stdTypeResolverBuilder); - mapper.configure(JsonParser.Feature.INCLUDE_SOURCE_IN_LOCATION, true); - - return mapper; + return jsonMapperBuilder() + .setDefaultTyping(stdTypeResolverBuilder) + .build(); } @Test From 149435bda889e11a1b3de6216a57f561dabdd9a7 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Mon, 16 Dec 2024 22:31:44 -0800 Subject: [PATCH 03/10] Fix the fix (although now fails different test case) --- .../impl/AsArrayTypeDeserializer.java | 11 ++----- .../databind/ser/BasicSerializerFactory.java | 14 +++++++- .../databind/ser/std/EnumSetSerializer.java | 32 ++++++++++++++----- ...erializationWithDefaultTyping4849Test.java | 4 +-- 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java index 53194cf602..04856eb13f 100644 --- a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/AsArrayTypeDeserializer.java @@ -147,14 +147,9 @@ protected String _locateTypeId(JsonParser p, DeserializationContext ctxt) throws } return id; } - // [databind#4849] Since 2.18.3, Should maybe allow defaultTyping without defaultImpl if type is already known - String id = _idResolver.idFromBaseType(); - if (id != null && _baseType.isConcrete()) { - return id; - } - ctxt.reportWrongTokenException(baseType(), JsonToken.START_ARRAY, - "need Array value to contain `As.WRAPPER_ARRAY` type information for class "+baseTypeName()); - return null; + ctxt.reportWrongTokenException(baseType(), JsonToken.START_ARRAY, + "need Array value to contain `As.WRAPPER_ARRAY` type information for class "+baseTypeName()); + return null; } // And then type id as a String JsonToken t = p.nextToken(); diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java index 8b8bd67625..d59b466141 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java @@ -725,7 +725,7 @@ protected JsonSerializer buildCollectionSerializer(SerializerProvider prov, if (!enumType.isEnumImplType()) { // usually since it's `Enum.class` enumType = null; } - ser = buildEnumSetSerializer(enumType); + ser = buildEnumSetSerializer(enumType, elementTypeSerializer); } else { Class elementRaw = type.getContentType().getRawClass(); if (isIndexedList(raw)) { @@ -781,10 +781,22 @@ public ContainerSerializer buildCollectionSerializer(JavaType elemType, return new CollectionSerializer(elemType, staticTyping, vts, valueSerializer); } + @Deprecated // since 2.19 public JsonSerializer buildEnumSetSerializer(JavaType enumType) { return new EnumSetSerializer(enumType); } + /** + * @since 2.18.3 + */ + public JsonSerializer buildEnumSetSerializer(JavaType enumType, TypeSerializer vts) { + EnumSetSerializer ser = new EnumSetSerializer(enumType); + if (vts == null) { + return ser; + } + return ser.withValueTypeSerializer(vts); + } + /* /********************************************************** /* Factory methods, for Maps diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java index 0995768d7e..4d046b5820 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java @@ -26,8 +26,7 @@ public EnumSetSerializer(EnumSetSerializer src, @Override public EnumSetSerializer _withValueTypeSerializer(TypeSerializer vts) { - // no typing for enums (always "hard" type) - return this; + return new EnumSetSerializer(this, _property, vts, _elementSerializer, _unwrapSingle); } @Override @@ -70,18 +69,35 @@ public void serializeContents(EnumSet> value, JsonGenerator ge SerializerProvider provider) throws IOException { + gen.assignCurrentValue(value); + if (_valueTypeSerializer != null) { + // 16-Dec-2024, tatu: As per [databind#4849], need to support polymorphic + // types for elements + _serializeTypedContents(value, gen, provider, _valueTypeSerializer); + return; + } JsonSerializer enumSer = _elementSerializer; - /* Need to dynamically find instance serializer; unfortunately - * that seems to be the only way to figure out type (no accessors - * to the enum class that set knows) - */ + // Need to dynamically find instance serializer; unfortunately + // that seems to be the only way to figure out type (no accessors + // to the enum class that set knows) for (Enum en : value) { if (enumSer == null) { - // 12-Jan-2010, tatu: Since enums cannot be polymorphic, let's - // not bother with typed serializer variant here enumSer = provider.findContentValueSerializer(en.getDeclaringClass(), _property); } enumSer.serialize(en, gen, provider); } } + + private void _serializeTypedContents(EnumSet> value, JsonGenerator gen, + SerializerProvider provider, TypeSerializer vts) + throws IOException + { + JsonSerializer enumSer = _elementSerializer; + for (Enum en : value) { + if (enumSer == null) { + enumSer = provider.findContentValueSerializer(en.getDeclaringClass(), _property); + } + enumSer.serializeWithType(en, gen, provider, vts); + } + } } diff --git a/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java b/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java index 5173940547..2cf543befb 100644 --- a/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java @@ -71,11 +71,11 @@ public void testHardCodedDeserializationFromPreviousJackson4849() throws Exception { // Given : Hard-coded output from Jackson 2.15.4 - String array = String.format("[\"java.util.EnumSet<%s>\",[\"%s\"]]", + String input = String.format("[\"java.util.EnumSet<%s>\",[\"%s\"]]", TestEnum4849.class.getName(), TestEnum4849.TEST_ENUM_VALUE.name()); // When - Object deserialized = MAPPER.readValue(array, Object.class); + Object deserialized = MAPPER.readValue(input, Object.class); // Then assertEquals(EnumSet.of(TestEnum4849.TEST_ENUM_VALUE), deserialized); } From a747657c8b28f3f66b70de9e2544573102c85489 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 17 Dec 2024 18:04:53 -0800 Subject: [PATCH 04/10] Try to undo parts of #4214, resolves this issue, but requires something wrt original problem --- .../deser/BasicDeserializerFactory.java | 3 +- .../deser/std/EnumSetDeserializer.java | 59 ++++--------------- .../databind/ser/std/EnumSetSerializer.java | 24 +------- ...erializationWithDefaultTyping4849Test.java | 2 +- .../EnumSetPolymorphicDeser4214Test.java | 5 +- 5 files changed, 21 insertions(+), 72 deletions(-) rename src/test/java/com/fasterxml/jackson/databind/{tofix => deser/enums}/EnumSetDeserializationWithDefaultTyping4849Test.java (98%) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java index fac775d75a..8e9dfedfa1 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java @@ -813,8 +813,7 @@ public JsonDeserializer createCollectionDeserializer(DeserializationContext c if (contentDeser == null) { // not defined by annotation // One special type: EnumSet: if (EnumSet.class.isAssignableFrom(collectionClass)) { - deser = new EnumSetDeserializer(contentType, null, - contentTypeDeser); + deser = new EnumSetDeserializer(contentType, null, null); } } } diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumSetDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumSetDeserializer.java index 09d45bf284..62d04e5df3 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumSetDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumSetDeserializer.java @@ -32,17 +32,6 @@ public class EnumSetDeserializer protected JsonDeserializer> _enumDeserializer; - /** - * If element instances have polymorphic type information, this - * is the type deserializer that can handle it. - *

- * NOTE: only added in 2.17 due to new {@code DefaultType} choices - * that allow polymorphic deserialization of {@code Enum} types. - * - * @since 2.17 - */ - protected final TypeDeserializer _valueTypeDeserializer; - /** * Handler we need for dealing with nulls. * @@ -74,11 +63,12 @@ public class EnumSetDeserializer */ /** - * @since 2.17 + * Main constructor for the deserializer. + *

+ * NOTE: was temporarily deprecated in 2.17 - 2.18, restored in 2.19 */ @SuppressWarnings("unchecked" ) - public EnumSetDeserializer(JavaType enumType, JsonDeserializer deser, - TypeDeserializer valueTypeDeser) + public EnumSetDeserializer(JavaType enumType, JsonDeserializer deser) { super(EnumSet.class); _enumType = enumType; @@ -87,19 +77,19 @@ public EnumSetDeserializer(JavaType enumType, JsonDeserializer deser, throw new IllegalArgumentException("Type "+enumType+" not Java Enum type"); } _enumDeserializer = (JsonDeserializer>) deser; - _valueTypeDeserializer = valueTypeDeser; _unwrapSingle = null; _nullProvider = null; _skipNullValues = false; } /** - * @deprecated Since 2.17 + * @deprecated Since 2.19 (was added in 2.17) */ @Deprecated - public EnumSetDeserializer(JavaType enumType, JsonDeserializer deser) + public EnumSetDeserializer(JavaType enumType, JsonDeserializer deser, + TypeDeserializer valueTypeDeser) { - this(enumType, deser, null); + this(enumType, deser); } /** @@ -121,7 +111,6 @@ protected EnumSetDeserializer(EnumSetDeserializer base, super(base); _enumType = base._enumType; _enumDeserializer = (JsonDeserializer>) deser; - _valueTypeDeserializer = base._valueTypeDeserializer; _nullProvider = nuller; _skipNullValues = NullsConstantProvider.isSkipper(nuller); _unwrapSingle = unwrapSingle; @@ -135,29 +124,18 @@ public EnumSetDeserializer withDeserializer(JsonDeserializer deser) { } /** - * @since 2.10.1 + * @since 2.19 */ public EnumSetDeserializer withResolved(JsonDeserializer deser, - TypeDeserializer valueTypeDeser, NullValueProvider nuller, Boolean unwrapSingle) { if ((Objects.equals(_unwrapSingle, unwrapSingle)) && (_enumDeserializer == deser) - && (_valueTypeDeserializer == valueTypeDeser) && (_nullProvider == deser)) { return this; } return new EnumSetDeserializer(this, deser, nuller, unwrapSingle); } - /** - * @deprecated Since 2.17 - */ - @Deprecated - public EnumSetDeserializer withResolved(JsonDeserializer deser, - NullValueProvider nuller, Boolean unwrapSingle) { - return withResolved(deser, _valueTypeDeserializer, nuller, unwrapSingle); - } - /* /********************************************************** /* Basic metadata @@ -171,9 +149,7 @@ public EnumSetDeserializer withResolved(JsonDeserializer deser, @Override public boolean isCachable() { // One caveat: content deserializer should prevent caching - if ((_enumType.getValueHandler() != null) - // Another: polymorphic deserialization - || (_valueTypeDeserializer != null)) { + if (_enumType.getValueHandler() != null) { return false; } return true; @@ -220,12 +196,7 @@ public JsonDeserializer createContextual(DeserializationContext ctxt, } else { // if directly assigned, probably not yet contextual, so: deser = ctxt.handleSecondaryContextualization(deser, property, _enumType); } - // and finally, type deserializer needs context as well - TypeDeserializer valueTypeDeser = _valueTypeDeserializer; - if (valueTypeDeser != null) { - valueTypeDeser = valueTypeDeser.forProperty(property); - } - return withResolved(deser, valueTypeDeser, + return withResolved(deser, findContentNullProvider(ctxt, property, deser), unwrapSingle); } @@ -261,10 +232,8 @@ public EnumSet deserialize(JsonParser p, DeserializationContext ctxt, protected final EnumSet _deserialize(JsonParser p, DeserializationContext ctxt, EnumSet result) throws IOException { - JsonToken t; - final TypeDeserializer typeDeser = _valueTypeDeserializer; - try { + JsonToken t; while ((t = p.nextToken()) != JsonToken.END_ARRAY) { // What to do with nulls? Fail or ignore? Fail, for now (note: would fail if we // 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 continue; } value = (Enum) _nullProvider.getNullValue(ctxt); - } else if (typeDeser == null) { - value = _enumDeserializer.deserialize(p, ctxt); } else { - value = (Enum) _enumDeserializer.deserializeWithType(p, ctxt, typeDeser); + value = _enumDeserializer.deserialize(p, ctxt); } if (value != null) { result.add(value); diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java index 4d046b5820..d2d14f84fd 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/EnumSetSerializer.java @@ -26,7 +26,8 @@ public EnumSetSerializer(EnumSetSerializer src, @Override public EnumSetSerializer _withValueTypeSerializer(TypeSerializer vts) { - return new EnumSetSerializer(this, _property, vts, _elementSerializer, _unwrapSingle); + // no typing for enum elements (always strongly typed), so don't change + return this; } @Override @@ -47,7 +48,7 @@ public boolean hasSingleElement(EnumSet> value) { } @Override - public final void serialize(EnumSet> value, JsonGenerator gen, + public void serialize(EnumSet> value, JsonGenerator gen, SerializerProvider provider) throws IOException { final int len = value.size(); @@ -70,12 +71,6 @@ public void serializeContents(EnumSet> value, JsonGenerator ge throws IOException { gen.assignCurrentValue(value); - if (_valueTypeSerializer != null) { - // 16-Dec-2024, tatu: As per [databind#4849], need to support polymorphic - // types for elements - _serializeTypedContents(value, gen, provider, _valueTypeSerializer); - return; - } JsonSerializer enumSer = _elementSerializer; // Need to dynamically find instance serializer; unfortunately // that seems to be the only way to figure out type (no accessors @@ -87,17 +82,4 @@ public void serializeContents(EnumSet> value, JsonGenerator ge enumSer.serialize(en, gen, provider); } } - - private void _serializeTypedContents(EnumSet> value, JsonGenerator gen, - SerializerProvider provider, TypeSerializer vts) - throws IOException - { - JsonSerializer enumSer = _elementSerializer; - for (Enum en : value) { - if (enumSer == null) { - enumSer = provider.findContentValueSerializer(en.getDeclaringClass(), _property); - } - enumSer.serializeWithType(en, gen, provider, vts); - } - } } diff --git a/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetDeserializationWithDefaultTyping4849Test.java similarity index 98% rename from src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java rename to src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetDeserializationWithDefaultTyping4849Test.java index 2cf543befb..2d7276c0b4 100644 --- a/src/test/java/com/fasterxml/jackson/databind/tofix/EnumSetDeserializationWithDefaultTyping4849Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetDeserializationWithDefaultTyping4849Test.java @@ -1,4 +1,4 @@ -package com.fasterxml.jackson.databind.tofix; +package com.fasterxml.jackson.databind.deser.enums; import java.util.EnumSet; diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetPolymorphicDeser4214Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetPolymorphicDeser4214Test.java index b628379dd8..550f9727bc 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetPolymorphicDeser4214Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetPolymorphicDeser4214Test.java @@ -39,13 +39,14 @@ public void testPolymorphicDeserialization4214() throws Exception { // Need to use Default Typing to trigger issue ObjectMapper mapper = jsonMapperBuilder() - .activateDefaultTyping(BasicPolymorphicTypeValidator.builder().allowIfBaseType(Object.class).build(), + .activateDefaultTyping(BasicPolymorphicTypeValidator.builder() + .allowIfBaseType(Object.class).build(), DefaultTyping.NON_FINAL_AND_ENUMS) .build(); EnumSetHolder enumSetHolder = new EnumSetHolder(); enumSetHolder.enumSet = EnumSet.allOf(MyEnum.class); - String json = mapper.writeValueAsString(enumSetHolder); + String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(enumSetHolder); EnumSetHolder result = mapper.readValue(json, EnumSetHolder.class); assertEquals(result, enumSetHolder); } From dfe7612cbaf32579975fa4bd203e36d9a310f1c9 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 17 Dec 2024 18:11:05 -0800 Subject: [PATCH 05/10] ... --- .../databind/ser/BasicSerializerFactory.java | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java index d59b466141..8b8bd67625 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/BasicSerializerFactory.java @@ -725,7 +725,7 @@ protected JsonSerializer buildCollectionSerializer(SerializerProvider prov, if (!enumType.isEnumImplType()) { // usually since it's `Enum.class` enumType = null; } - ser = buildEnumSetSerializer(enumType, elementTypeSerializer); + ser = buildEnumSetSerializer(enumType); } else { Class elementRaw = type.getContentType().getRawClass(); if (isIndexedList(raw)) { @@ -781,22 +781,10 @@ public ContainerSerializer buildCollectionSerializer(JavaType elemType, return new CollectionSerializer(elemType, staticTyping, vts, valueSerializer); } - @Deprecated // since 2.19 public JsonSerializer buildEnumSetSerializer(JavaType enumType) { return new EnumSetSerializer(enumType); } - /** - * @since 2.18.3 - */ - public JsonSerializer buildEnumSetSerializer(JavaType enumType, TypeSerializer vts) { - EnumSetSerializer ser = new EnumSetSerializer(enumType); - if (vts == null) { - return ser; - } - return ser.withValueTypeSerializer(vts); - } - /* /********************************************************** /* Factory methods, for Maps From 06d4b5bfba3f262a1266da90a1aa28dae6ffb05a Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 18 Dec 2024 17:19:25 -0800 Subject: [PATCH 06/10] Complete the fix --- .../ser/std/CollectionSerializer.java | 23 +++++++++++++++++-- .../EnumSetPolymorphicDeser4214Test.java | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java index 6b7f718fb6..d4c2e8a0d1 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.util.Collection; +import java.util.EnumSet; import java.util.Iterator; import com.fasterxml.jackson.core.*; @@ -27,6 +28,15 @@ public class CollectionSerializer { private static final long serialVersionUID = 1L; + /** + * Flag that indicates that we may need to check for EnumSet dynamically + * during serialization: problem being that we can't always do it statically. + * But we can figure out when there is a possibility wrt type signature we get. + * + * @since 2.18.3 + */ + private final boolean _maybeEnumSet; + /* /********************************************************** /* Life-cycle @@ -39,6 +49,10 @@ public class CollectionSerializer public CollectionSerializer(JavaType elemType, boolean staticTyping, TypeSerializer vts, JsonSerializer valueSerializer) { super(Collection.class, elemType, staticTyping, vts, valueSerializer); + // Unfortunately we can't check for EnumSet statically (if type indicated it, + // we'd have constructed `EnumSetSerializer` instead). But we can check that + // element type could possibly be an Enum. + _maybeEnumSet = elemType.isEnumType() || elemType.isJavaLangObject(); } /** @@ -55,6 +69,7 @@ public CollectionSerializer(CollectionSerializer src, BeanProperty property, TypeSerializer vts, JsonSerializer valueSerializer, Boolean unwrapSingle) { super(src, property, vts, valueSerializer, unwrapSingle); + _maybeEnumSet = src._maybeEnumSet; } @Override @@ -121,7 +136,9 @@ public void serializeContents(Collection value, JsonGenerator g, SerializerPr return; } PropertySerializerMap serializers = _dynamicSerializers; - final TypeSerializer typeSer = _valueTypeSerializer; + // [databind#4849]/[databiund#4214]: need to check for EnumSet + final TypeSerializer typeSer = (_maybeEnumSet && value instanceof EnumSet) + ? null : _valueTypeSerializer; int i = 0; try { @@ -159,7 +176,9 @@ public void serializeContentsUsing(Collection value, JsonGenerator g, Seriali { Iterator it = value.iterator(); if (it.hasNext()) { - TypeSerializer typeSer = _valueTypeSerializer; + // [databind#4849]/[databiund#4214]: need to check for EnumSet + final TypeSerializer typeSer = (_maybeEnumSet && value instanceof EnumSet) + ? null : _valueTypeSerializer; int i = 0; do { Object elem = it.next(); diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetPolymorphicDeser4214Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetPolymorphicDeser4214Test.java index 550f9727bc..50173c64bc 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetPolymorphicDeser4214Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSetPolymorphicDeser4214Test.java @@ -46,7 +46,7 @@ public void testPolymorphicDeserialization4214() throws Exception EnumSetHolder enumSetHolder = new EnumSetHolder(); enumSetHolder.enumSet = EnumSet.allOf(MyEnum.class); - String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(enumSetHolder); + String json = mapper.writeValueAsString(enumSetHolder); EnumSetHolder result = mapper.readValue(json, EnumSetHolder.class); assertEquals(result, enumSetHolder); } From e36455b80743540d18b3d0e4bb5c13e08cacb00e Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 18 Dec 2024 17:26:07 -0800 Subject: [PATCH 07/10] Fix a test case, typos --- release-notes/VERSION-2.x | 2 +- .../jackson/databind/ser/std/CollectionSerializer.java | 2 +- .../fasterxml/jackson/databind/ser/TestCustomSerializers.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 3661c8628f..4511d98ece 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -10,7 +10,7 @@ Project: jackson-databind index for property 'cause' (reported by @nilswieber) (fix by Joo-Hyuk K) -#4844: Fix wrapped array hanlding wrt `null` by `StdDeserializer` +#4844: Fix wrapped array handling wrt `null` by `StdDeserializer` (fix by Stanislav S) #4849 Not able to deserialize Enum with default typing after upgrading 2.15.4 -> 2.17.1 (reported by Kornel Zemla) diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java index d4c2e8a0d1..7631233bc8 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java @@ -136,7 +136,7 @@ public void serializeContents(Collection value, JsonGenerator g, SerializerPr return; } PropertySerializerMap serializers = _dynamicSerializers; - // [databind#4849]/[databiund#4214]: need to check for EnumSet + // [databind#4849]/[databind#4214]: need to check for EnumSet final TypeSerializer typeSer = (_maybeEnumSet && value instanceof EnumSet) ? null : _valueTypeSerializer; diff --git a/src/test/java/com/fasterxml/jackson/databind/ser/TestCustomSerializers.java b/src/test/java/com/fasterxml/jackson/databind/ser/TestCustomSerializers.java index 4a8c35eacb..f4a2fc92e8 100644 --- a/src/test/java/com/fasterxml/jackson/databind/ser/TestCustomSerializers.java +++ b/src/test/java/com/fasterxml/jackson/databind/ser/TestCustomSerializers.java @@ -264,7 +264,7 @@ public void testCustomization() throws Exception public void testCustomLists() throws Exception { SimpleModule module = new SimpleModule("test", Version.unknownVersion()); - JsonSerializer ser = new CollectionSerializer(null, false, null, null); + JsonSerializer ser = new CollectionSerializer(MAPPER.constructType(Object.class), false, null, null); final JsonSerializer collectionSerializer = (JsonSerializer) ser; module.addSerializer(Collection.class, new JsonSerializer() { From 80a7b86e876ad284e155ba3c762ac8be2978591d Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 18 Dec 2024 17:27:40 -0800 Subject: [PATCH 08/10] fix release notes --- release-notes/VERSION-2.x | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 4ef5885182..e6293c846d 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -31,7 +31,10 @@ Project: jackson-databind (reported by Eduard G) #4773: `SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS` should not apply to Maps with uncomparable keys - (requested by @nathanukey) + (requested by @nathanukey +#4849 Not able to deserialize Enum with default typing after upgrading 2.15.4 -> 2.17.1 + (reported by Kornel Zemla) + (fix by Joo-Hyuk K) 2.18.3 (not yet released) @@ -41,9 +44,6 @@ Project: jackson-databind (fix by Joo-Hyuk K) #4844: Fix wrapped array handling wrt `null` by `StdDeserializer` (fix by Stanislav S) -#4849 Not able to deserialize Enum with default typing after upgrading 2.15.4 -> 2.17.1 - (reported by Kornel Zemla) - (fix by Joo-Hyuk K) 2.18.2 (27-Nov-2024) From b8dcf644824c8536304ec0e796c75c3a055b19aa Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 18 Dec 2024 17:32:25 -0800 Subject: [PATCH 09/10] Warnings clean up --- .../databind/deser/BasicDeserializerFactory.java | 2 +- .../databind/deser/std/EnumSetDeserializer.java | 10 ---------- .../databind/ser/std/CollectionSerializer.java | 12 +----------- .../fasterxml/jackson/databind/ObjectMapperTest.java | 2 +- .../deser/creators/ValueInstantiatorTest.java | 1 - .../deser/jdk/MapWithGenericValuesDeserTest.java | 1 - .../SubclassedThrowableDeserialization4827Test.java | 4 ++-- .../jsontype/deftyping/TestDefaultForMaps.java | 1 - .../databind/jsontype/jdk/TypedArrayDeserTest.java | 1 - .../fasterxml/jackson/databind/ser/TestRootType.java | 1 - .../jackson/databind/ser/jdk/NumberSerTest.java | 2 +- .../PolymorphicDeserWithJsonUnwrapped4792Test.java | 2 +- 12 files changed, 7 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java index 68deeff751..d59d537e2f 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java @@ -788,7 +788,7 @@ public JsonDeserializer createCollectionDeserializer(DeserializationContext c if (contentDeser == null) { // not defined by annotation // One special type: EnumSet: if (EnumSet.class.isAssignableFrom(collectionClass)) { - deser = new EnumSetDeserializer(contentType, null, null); + deser = new EnumSetDeserializer(contentType, null); } } } diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumSetDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumSetDeserializer.java index 62d04e5df3..26521b58af 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumSetDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/EnumSetDeserializer.java @@ -92,16 +92,6 @@ public EnumSetDeserializer(JavaType enumType, JsonDeserializer deser, this(enumType, deser); } - /** - * @since 2.7 - * @deprecated Since 2.10.1 - */ - @Deprecated - protected EnumSetDeserializer(EnumSetDeserializer base, - JsonDeserializer deser, Boolean unwrapSingle) { - this(base, deser, base._nullProvider, unwrapSingle); - } - /** * @since 2.10.1 */ diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java b/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java index 5664e56be1..75202d2734 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/std/CollectionSerializer.java @@ -54,16 +54,6 @@ public CollectionSerializer(JavaType elemType, boolean staticTyping, TypeSeriali _maybeEnumSet = elemType.isEnumType() || elemType.isJavaLangObject(); } - /** - * @deprecated since 2.6 - */ - @Deprecated // since 2.6 - public CollectionSerializer(JavaType elemType, boolean staticTyping, TypeSerializer vts, - BeanProperty property, JsonSerializer valueSerializer) { - // note: assumption is 'property' is always passed as null - this(elemType, staticTyping, vts, valueSerializer); - } - public CollectionSerializer(CollectionSerializer src, BeanProperty property, TypeSerializer vts, JsonSerializer valueSerializer, Boolean unwrapSingle) { @@ -175,7 +165,7 @@ public void serializeContentsUsing(Collection value, JsonGenerator g, Seriali { Iterator it = value.iterator(); if (it.hasNext()) { - // [databind#4849]/[databiund#4214]: need to check for EnumSet + // [databind#4849]/[databind#4214]: need to check for EnumSet final TypeSerializer typeSer = (_maybeEnumSet && value instanceof EnumSet) ? null : _valueTypeSerializer; int i = 0; diff --git a/src/test/java/com/fasterxml/jackson/databind/ObjectMapperTest.java b/src/test/java/com/fasterxml/jackson/databind/ObjectMapperTest.java index dd7d9e923b..4fb454862d 100644 --- a/src/test/java/com/fasterxml/jackson/databind/ObjectMapperTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/ObjectMapperTest.java @@ -283,7 +283,7 @@ public void jsonMapperRebuildTest() JsonMapper m3 = m2.rebuild() .propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE) - .enumNamingStrategy(EnumNamingStrategies.CamelCaseStrategy.INSTANCE) + .enumNamingStrategy(EnumNamingStrategies.UPPER_CAMEL_CASE) .enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS) .enable(EnumFeature.WRITE_ENUMS_TO_LOWERCASE) .build(); diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/creators/ValueInstantiatorTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/creators/ValueInstantiatorTest.java index 0732c2d38e..058497901a 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/creators/ValueInstantiatorTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/creators/ValueInstantiatorTest.java @@ -12,7 +12,6 @@ import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; import com.fasterxml.jackson.databind.introspect.AnnotatedWithParams; import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.databind.type.TypeFactory; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/MapWithGenericValuesDeserTest.java b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/MapWithGenericValuesDeserTest.java index e1c1839c95..05a84549ef 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/MapWithGenericValuesDeserTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/MapWithGenericValuesDeserTest.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; -import com.fasterxml.jackson.databind.type.TypeFactory; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; diff --git a/src/test/java/com/fasterxml/jackson/databind/exc/SubclassedThrowableDeserialization4827Test.java b/src/test/java/com/fasterxml/jackson/databind/exc/SubclassedThrowableDeserialization4827Test.java index c3bc887a58..7f276751c2 100644 --- a/src/test/java/com/fasterxml/jackson/databind/exc/SubclassedThrowableDeserialization4827Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/exc/SubclassedThrowableDeserialization4827Test.java @@ -11,11 +11,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals; // [databind#4827] Subclassed Throwable deserialization fails since v2.18.0 -// no creator index for property 'cause' +// no creator index for property 'cause' public class SubclassedThrowableDeserialization4827Test extends DatabindTestUtil { - + @SuppressWarnings("serial") public static class SubclassedExceptionJava extends Exception { @JsonCreator public SubclassedExceptionJava( diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/deftyping/TestDefaultForMaps.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/deftyping/TestDefaultForMaps.java index 1a6d2c752b..1a62ec184d 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/deftyping/TestDefaultForMaps.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/deftyping/TestDefaultForMaps.java @@ -13,7 +13,6 @@ import com.fasterxml.jackson.databind.jsontype.impl.TypeNameIdResolver; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; import com.fasterxml.jackson.databind.testutil.NoCheckSubTypeValidator; -import com.fasterxml.jackson.databind.type.TypeFactory; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/com/fasterxml/jackson/databind/jsontype/jdk/TypedArrayDeserTest.java b/src/test/java/com/fasterxml/jackson/databind/jsontype/jdk/TypedArrayDeserTest.java index a4125e8025..12f06e8ff5 100644 --- a/src/test/java/com/fasterxml/jackson/databind/jsontype/jdk/TypedArrayDeserTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/jsontype/jdk/TypedArrayDeserTest.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; -import com.fasterxml.jackson.databind.type.TypeFactory; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/com/fasterxml/jackson/databind/ser/TestRootType.java b/src/test/java/com/fasterxml/jackson/databind/ser/TestRootType.java index 4271117cc1..cffb749401 100644 --- a/src/test/java/com/fasterxml/jackson/databind/ser/TestRootType.java +++ b/src/test/java/com/fasterxml/jackson/databind/ser/TestRootType.java @@ -14,7 +14,6 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; -import com.fasterxml.jackson.databind.type.TypeFactory; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/com/fasterxml/jackson/databind/ser/jdk/NumberSerTest.java b/src/test/java/com/fasterxml/jackson/databind/ser/jdk/NumberSerTest.java index 4181f64275..2efa4f5551 100644 --- a/src/test/java/com/fasterxml/jackson/databind/ser/jdk/NumberSerTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/ser/jdk/NumberSerTest.java @@ -223,7 +223,7 @@ public void testCustomSerializationBigDecimalAsNumber() throws Exception { } // default locale is en_US - private static DecimalFormat createDecimalFormatForDefaultLocale(final String pattern) { + static DecimalFormat createDecimalFormatForDefaultLocale(final String pattern) { return new DecimalFormat(pattern, new DecimalFormatSymbols(Locale.ENGLISH)); } } diff --git a/src/test/java/com/fasterxml/jackson/databind/tofix/PolymorphicDeserWithJsonUnwrapped4792Test.java b/src/test/java/com/fasterxml/jackson/databind/tofix/PolymorphicDeserWithJsonUnwrapped4792Test.java index a80b292112..640baad1f5 100644 --- a/src/test/java/com/fasterxml/jackson/databind/tofix/PolymorphicDeserWithJsonUnwrapped4792Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/tofix/PolymorphicDeserWithJsonUnwrapped4792Test.java @@ -26,7 +26,7 @@ interface Parent { } static class SubA implements Parent { @JsonUnwrapped @JsonProperty(access = READ_ONLY) - private Model model; + Model model; @JsonCreator public SubA(@JsonProperty("model") Model model) { From 274e8ef4a78ab7808a8800e01b01cdd23f99c7b6 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 18 Dec 2024 17:33:14 -0800 Subject: [PATCH 10/10] Update release-notes/VERSION-2.x Co-authored-by: Kim, Joo Hyuk --- release-notes/VERSION-2.x | 1 - 1 file changed, 1 deletion(-) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index e6293c846d..01edfab399 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -34,7 +34,6 @@ Project: jackson-databind (requested by @nathanukey #4849 Not able to deserialize Enum with default typing after upgrading 2.15.4 -> 2.17.1 (reported by Kornel Zemla) - (fix by Joo-Hyuk K) 2.18.3 (not yet released)