From bfc99571989cbb8a95afd925fe17884581a650c6 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Thu, 6 Jun 2024 23:39:39 +0900 Subject: [PATCH 1/2] Enable `DeserializationFeature.READ_ENUMS_USING_TO_STRING` by default --- .../java/tools/jackson/databind/DeserializationFeature.java | 4 ++-- .../jackson/databind/deser/creators/EnumCreatorTest.java | 2 +- .../jackson/databind/deser/enums/EnumDefaultReadTest.java | 4 +++- .../databind/deser/enums/EnumDeserFromIntJsonValueTest.java | 6 ++++-- .../databind/deser/enums/EnumDeserMixin2787Test.java | 4 +++- .../databind/deser/enums/EnumDeserializationTest.java | 1 + .../databind/jsontype/deftyping/TestDefaultForObject.java | 4 +++- 7 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/tools/jackson/databind/DeserializationFeature.java b/src/main/java/tools/jackson/databind/DeserializationFeature.java index c3e617c272..963cbcda16 100644 --- a/src/main/java/tools/jackson/databind/DeserializationFeature.java +++ b/src/main/java/tools/jackson/databind/DeserializationFeature.java @@ -396,9 +396,9 @@ public enum DeserializationFeature implements ConfigFeature * Note: this feature should usually have same value * as {@link SerializationFeature#WRITE_ENUMS_USING_TO_STRING}. *

- * Feature is disabled by default. + * Feature is enabled by default. */ - READ_ENUMS_USING_TO_STRING(false), + READ_ENUMS_USING_TO_STRING(true), /** * Feature that allows unknown Enum values to be parsed as {@code null} values. diff --git a/src/test/java/tools/jackson/databind/deser/creators/EnumCreatorTest.java b/src/test/java/tools/jackson/databind/deser/creators/EnumCreatorTest.java index d53fa3ae59..6988e49d87 100644 --- a/src/test/java/tools/jackson/databind/deser/creators/EnumCreatorTest.java +++ b/src/test/java/tools/jackson/databind/deser/creators/EnumCreatorTest.java @@ -343,7 +343,7 @@ public void testNoArgEnumCreator() throws Exception @Test public void testEnumCreators1291() throws Exception { - ObjectMapper mapper = new ObjectMapper(); + ObjectMapper mapper = jsonMapperBuilder().disable(DeserializationFeature.READ_ENUMS_USING_TO_STRING).build(); String json = mapper.writeValueAsString(Enum1291.V2); Enum1291 result = mapper.readValue(json, Enum1291.class); assertSame(Enum1291.V2, result); diff --git a/src/test/java/tools/jackson/databind/deser/enums/EnumDefaultReadTest.java b/src/test/java/tools/jackson/databind/deser/enums/EnumDefaultReadTest.java index d3e820997e..fecb927811 100644 --- a/src/test/java/tools/jackson/databind/deser/enums/EnumDefaultReadTest.java +++ b/src/test/java/tools/jackson/databind/deser/enums/EnumDefaultReadTest.java @@ -91,7 +91,9 @@ enum MixinOverloadedDefault { /********************************************************** */ - private final ObjectMapper MAPPER = newJsonMapper(); + private final ObjectMapper MAPPER = jsonMapperBuilder() + .disable(DeserializationFeature.READ_ENUMS_USING_TO_STRING) + .build(); @Test public void testWithoutCustomFeatures() throws Exception diff --git a/src/test/java/tools/jackson/databind/deser/enums/EnumDeserFromIntJsonValueTest.java b/src/test/java/tools/jackson/databind/deser/enums/EnumDeserFromIntJsonValueTest.java index f77e5242b6..6920e51d66 100644 --- a/src/test/java/tools/jackson/databind/deser/enums/EnumDeserFromIntJsonValueTest.java +++ b/src/test/java/tools/jackson/databind/deser/enums/EnumDeserFromIntJsonValueTest.java @@ -8,7 +8,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import static tools.jackson.databind.testutil.DatabindTestUtil.newJsonMapper; +import static tools.jackson.databind.testutil.DatabindTestUtil.jsonMapperBuilder; public class EnumDeserFromIntJsonValueTest { @@ -44,7 +44,8 @@ enum Bean1850LongField { Bean1850LongField(long x) { this.x = x; } } - private final ObjectMapper MAPPER = newJsonMapper(); + private final ObjectMapper MAPPER = jsonMapperBuilder() + .disable(DeserializationFeature.READ_ENUMS_USING_TO_STRING).build(); // [databind#1850] pass tests @@ -60,6 +61,7 @@ public void testEnumFromInt1850Method() throws Exception public void testEnumFromInt1850Field() throws Exception { String json = MAPPER.writeValueAsString(Bean1850IntField.A); + Bean1850IntField e2 = MAPPER.readValue(json, Bean1850IntField.class); assertEquals(Bean1850IntField.A, e2); } diff --git a/src/test/java/tools/jackson/databind/deser/enums/EnumDeserMixin2787Test.java b/src/test/java/tools/jackson/databind/deser/enums/EnumDeserMixin2787Test.java index 1e11d0a503..41eb63d1ea 100644 --- a/src/test/java/tools/jackson/databind/deser/enums/EnumDeserMixin2787Test.java +++ b/src/test/java/tools/jackson/databind/deser/enums/EnumDeserMixin2787Test.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonProperty; +import tools.jackson.databind.DeserializationFeature; import tools.jackson.databind.MapperFeature; import tools.jackson.databind.ObjectMapper; import tools.jackson.databind.exc.InvalidFormatException; @@ -197,6 +198,7 @@ private ObjectMapper mapperWithMixIn(Class target, Class mixin) { } private JsonMapper.Builder builderWithMixIn(Class target, Class mixin) { - return JsonMapper.builder().addMixIn(target, mixin); + return JsonMapper.builder().disable(DeserializationFeature.READ_ENUMS_USING_TO_STRING) + .addMixIn(target, mixin); } } diff --git a/src/test/java/tools/jackson/databind/deser/enums/EnumDeserializationTest.java b/src/test/java/tools/jackson/databind/deser/enums/EnumDeserializationTest.java index b617ff48bf..29b43c8d08 100644 --- a/src/test/java/tools/jackson/databind/deser/enums/EnumDeserializationTest.java +++ b/src/test/java/tools/jackson/databind/deser/enums/EnumDeserializationTest.java @@ -615,6 +615,7 @@ public void testEnumWithJsonPropertyRenameMixin() throws Exception public void testDeserWithToString1161() throws Exception { Enum1161 result = MAPPER.readerFor(Enum1161.class) + .without(DeserializationFeature.READ_ENUMS_USING_TO_STRING) .readValue(q("A")); assertSame(Enum1161.A, result); diff --git a/src/test/java/tools/jackson/databind/jsontype/deftyping/TestDefaultForObject.java b/src/test/java/tools/jackson/databind/jsontype/deftyping/TestDefaultForObject.java index 9c6d4d4aef..4cc016227d 100644 --- a/src/test/java/tools/jackson/databind/jsontype/deftyping/TestDefaultForObject.java +++ b/src/test/java/tools/jackson/databind/jsontype/deftyping/TestDefaultForObject.java @@ -106,7 +106,8 @@ public Validity validateBaseType(DatabindContext ctxt, JavaType baseType) { /********************************************************** */ - private final ObjectMapper MAPPER = newJsonMapper(); + private final ObjectMapper MAPPER = jsonMapperBuilder() + .disable(DeserializationFeature.READ_ENUMS_USING_TO_STRING).build(); /** * Unit test that verifies that a bean is stored with type information, @@ -248,6 +249,7 @@ public void testEnumAsObject() throws Exception // and then with it ObjectMapper m = jsonMapperBuilder() + .disable(DeserializationFeature.READ_ENUMS_USING_TO_STRING) .activateDefaultTyping(NoCheckSubTypeValidator.instance) .build(); String json = m.writeValueAsString(input); From 1bf1f4b0384715bc0d09014336468e1d4d49c321 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Thu, 6 Jun 2024 21:37:13 -0700 Subject: [PATCH 2/2] Update release notes, minor add to Javadoc --- release-notes/VERSION | 2 ++ .../tools/jackson/databind/DeserializationFeature.java | 10 +++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/release-notes/VERSION b/release-notes/VERSION index 619ce0a164..4e08b98fa6 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -58,6 +58,8 @@ Versions: 3.x (for earlier see VERSION-2.x) #4160: Deprecate `DefaultTyping.EVERYTHING` in `2.x` and remove in `3.0` #4381: Prevent construction of `null`-valued `JsonNode`s (like `TextNode`) #4552: Change `MapperFeature.ALLOW_FINAL_FIELDS_AS_MUTATORS` default to `false` for 3.0 +#4566: Enable `DeserializationFeature.READ_ENUMS_USING_TO_STRING` by default (3.0) + (contributed by Joo-Hyuk K) - Remove `MappingJsonFactory` - Add context parameter for `TypeSerializer` contextualization (`forProperty()`) - Default for `JsonNodeFeature.STRIP_TRAILING_BIGDECIMAL_ZEROES` changed to `false` for 3.0 diff --git a/src/main/java/tools/jackson/databind/DeserializationFeature.java b/src/main/java/tools/jackson/databind/DeserializationFeature.java index 963cbcda16..164cf58f97 100644 --- a/src/main/java/tools/jackson/databind/DeserializationFeature.java +++ b/src/main/java/tools/jackson/databind/DeserializationFeature.java @@ -388,15 +388,15 @@ public enum DeserializationFeature implements ConfigFeature ACCEPT_FLOAT_AS_INT(true), /** - * Feature that determines standard deserialization mechanism used for - * Enum values: if enabled, Enums are assumed to have been serialized using - * return value of Enum.toString(); - * if disabled, return value of Enum.name() is assumed to have been used. + * Feature that determines the deserialization mechanism used for + * Enum values: if enabled, Enums are assumed to have been serialized using + * return value of {@code Enum.toString()}; + * if disabled, return value of {@code Enum.name()} is assumed to have been used. *

* Note: this feature should usually have same value * as {@link SerializationFeature#WRITE_ENUMS_USING_TO_STRING}. *

- * Feature is enabled by default. + * Feature is enabled by default as of Jackson 3.0 (in 2.x it was disabled). */ READ_ENUMS_USING_TO_STRING(true),