From f18225ac2238620ebf44678c4fa6dde7bcc8e262 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Thu, 11 Jan 2024 23:06:06 +0900 Subject: [PATCH 1/5] Write reproduction --- .../introspect/POJOPropertiesCollector.java | 2 ++ .../deser/enums/EnumSameName4302Test.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java index 6a07497c92..3b9ee9f378 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java @@ -1130,6 +1130,8 @@ protected void _renameUsing(Map propMap, String rename = null; // [databind#4302] since 2.17, Need to skip renaming for Enum properties if (!prop.hasSetter() && prop.getPrimaryType().isEnumType()) { + // Just put back + propMap.put(fullName.getSimpleName(), prop); continue; } // As per [databind#428] need to skip renaming if property has diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java index 99ada467d4..438763f60e 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java @@ -52,10 +52,23 @@ public void setCat(String cat) { } } + enum AsField4302Enum { + SOME_PERSON; + } + + static class AsField4302Bean { + public AsField4302Enum somePerson = AsField4302Enum.SOME_PERSON; + public String someOtherField = "someOtherField"; + } + private final ObjectMapper MAPPER = jsonMapperBuilder() .propertyNamingStrategy(PropertyNamingStrategies.LOWER_CASE) .build(); + private final ObjectMapper SNAKE_MAPPER = jsonMapperBuilder() + .propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE) + .build(); + @Test void testShouldWork() throws Exception { @@ -78,5 +91,17 @@ void testShouldWork() throws Exception assertEquals(q("CAT"), MAPPER.writeValueAsString(Setter4302Enum.CAT)); } + + @Test + void testDeserializeSuccessfulUnaffectedField() throws Exception + { + AsField4302Bean bean = new AsField4302Bean(); + + assertEquals("{\"some_person\":\"SOME_PERSON\",\"some_other_field\":\"someOtherField\"}", + SNAKE_MAPPER.writeValueAsString(bean)); + + AsField4302Bean result = SNAKE_MAPPER.readValue("{\"somePerson\":\"SOME_PERSON\"}", + AsField4302Bean.class); + } } From 929b8dfb671e2d275ce48845418fd5e194c04ca3 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Thu, 11 Jan 2024 23:11:59 +0900 Subject: [PATCH 2/5] Update EnumSameName4302Test.java --- .../databind/deser/enums/EnumSameName4302Test.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java index 438763f60e..b1a01d592d 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java @@ -53,11 +53,12 @@ public void setCat(String cat) { } enum AsField4302Enum { + APPLE_SUGAR, SOME_PERSON; } static class AsField4302Bean { - public AsField4302Enum somePerson = AsField4302Enum.SOME_PERSON; + public AsField4302Enum somePerson = AsField4302Enum.APPLE_SUGAR; public String someOtherField = "someOtherField"; } @@ -97,11 +98,15 @@ void testDeserializeSuccessfulUnaffectedField() throws Exception { AsField4302Bean bean = new AsField4302Bean(); - assertEquals("{\"some_person\":\"SOME_PERSON\",\"some_other_field\":\"someOtherField\"}", + // ser + assertEquals("{\"somePerson\":\"APPLE_SUGAR\",\"some_other_field\":\"someOtherField\"}", SNAKE_MAPPER.writeValueAsString(bean)); - AsField4302Bean result = SNAKE_MAPPER.readValue("{\"somePerson\":\"SOME_PERSON\"}", + // deser + AsField4302Bean result = SNAKE_MAPPER.readValue("{\"somePerson\":\"SOME_PERSON\", \"some_other_field\":\"thisField\"}", AsField4302Bean.class); + assertEquals(AsField4302Enum.SOME_PERSON, result.somePerson); + assertEquals("thisField", result.someOtherField); } } From 76d2095151b3f601efeec0f76369f3a03801b1e4 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Fri, 12 Jan 2024 00:37:28 +0900 Subject: [PATCH 3/5] Complete fix --- .../databind/introspect/POJOPropertiesCollector.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java index 3b9ee9f378..9e3968774a 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java @@ -1128,8 +1128,11 @@ protected void _renameUsing(Map propMap, for (POJOPropertyBuilder prop : props) { PropertyName fullName = prop.getFullName(); String rename = null; - // [databind#4302] since 2.17, Need to skip renaming for Enum properties - if (!prop.hasSetter() && prop.getPrimaryType().isEnumType()) { + // [databind#4302] since 2.16, Need to skip renaming for Enum instances, but rename fields + if (!prop.hasSetter() + && Objects.nonNull(prop.getField()) + && (Objects.equals(_type, prop.getField().getType()) && prop.getPrimaryType().isEnumType()) + ) { // Just put back propMap.put(fullName.getSimpleName(), prop); continue; From c040595e852315648f91e8d2c428eea44cd3e7af Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Fri, 12 Jan 2024 00:37:31 +0900 Subject: [PATCH 4/5] Update EnumSameName4302Test.java --- .../deser/enums/EnumSameName4302Test.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java index b1a01d592d..28a5cf5e71 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/enums/EnumSameName4302Test.java @@ -8,6 +8,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static com.fasterxml.jackson.databind.BaseMapTest.jsonMapperBuilder; +import static com.fasterxml.jackson.databind.BaseTest.a2q; import static com.fasterxml.jackson.databind.BaseTest.q; // [databind#4302] @@ -58,8 +59,8 @@ enum AsField4302Enum { } static class AsField4302Bean { - public AsField4302Enum somePerson = AsField4302Enum.APPLE_SUGAR; - public String someOtherField = "someOtherField"; + public AsField4302Enum someEnum = AsField4302Enum.APPLE_SUGAR; + public String otherProp = "someOtherField"; } private final ObjectMapper MAPPER = jsonMapperBuilder() @@ -98,15 +99,16 @@ void testDeserializeSuccessfulUnaffectedField() throws Exception { AsField4302Bean bean = new AsField4302Bean(); - // ser - assertEquals("{\"somePerson\":\"APPLE_SUGAR\",\"some_other_field\":\"someOtherField\"}", + // test serialization + assertEquals( + a2q("{'some_enum':'APPLE_SUGAR','other_prop':'someOtherField'}"), SNAKE_MAPPER.writeValueAsString(bean)); - // deser - AsField4302Bean result = SNAKE_MAPPER.readValue("{\"somePerson\":\"SOME_PERSON\", \"some_other_field\":\"thisField\"}", - AsField4302Bean.class); - assertEquals(AsField4302Enum.SOME_PERSON, result.somePerson); - assertEquals("thisField", result.someOtherField); + // test deserialization + AsField4302Bean result = SNAKE_MAPPER.readValue( + a2q("{'some_enum':'SOME_PERSON', 'other_prop':'thisField'}"), AsField4302Bean.class); + assertEquals(AsField4302Enum.SOME_PERSON, result.someEnum); + assertEquals("thisField", result.otherProp); } } From 6cee8f3a9d889aa54073fd36a5bb40b229716c81 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Fri, 12 Jan 2024 00:54:58 +0900 Subject: [PATCH 5/5] Update POJOPropertiesCollector.java --- .../jackson/databind/introspect/POJOPropertiesCollector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java index 9e3968774a..89dd4ac44d 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java @@ -1128,7 +1128,7 @@ protected void _renameUsing(Map propMap, for (POJOPropertyBuilder prop : props) { PropertyName fullName = prop.getFullName(); String rename = null; - // [databind#4302] since 2.16, Need to skip renaming for Enum instances, but rename fields + // [databind#4302] since 2.16, Need to skip renaming for Enum instances (but not for Enum fields) if (!prop.hasSetter() && Objects.nonNull(prop.getField()) && (Objects.equals(_type, prop.getField().getType()) && prop.getPrimaryType().isEnumType())