From 5f85c86ab74a27c67ac72151001f20cc5be33e11 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Thu, 14 Dec 2023 01:19:55 +0900 Subject: [PATCH 1/3] Create DoubleUnwrappedWithAnySetter3277Test.java --- .../DoubleUnwrappedWithAnySetter3277Test.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java new file mode 100644 index 0000000000..361fb7e883 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java @@ -0,0 +1,63 @@ +package com.fasterxml.jackson.databind.deser.jdk; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonUnwrapped; +import com.fasterxml.jackson.databind.ObjectMapper; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import static com.fasterxml.jackson.databind.BaseMapTest.newJsonMapper; + +/** + * Test to verify that [databind#3277] is fixed. + */ +public class DoubleUnwrappedWithAnySetter3277Test +{ + + static class Holder { + + private Object value1; + + @JsonUnwrapped + private Holder2 holder2; + + public Object getValue1() { + return value1; + } + + public void setValue1(Object value1) { + this.value1 = value1; + } + } + + static class Holder2 { + private Map data = new HashMap<>(); + + @JsonAnyGetter + public Map getData() { + return data; + } + + @JsonAnySetter + public void setAny(String key, Object value) { + data.put(key, value); + } + } + + private final ObjectMapper MAPPER = newJsonMapper(); + + @Test + public void testIsInstanceOfDouble() throws Exception + { + Holder holder = MAPPER.readValue("{\"value1\": -60.0, \"value2\": -60.0}", Holder.class); + + assertEquals(Double.class, holder.value1.getClass()); + assertEquals(Double.class, holder.holder2.data.get("value2").getClass()); + } +} From fe5611be3ea26caea1126dc46fba6d9b0344082e Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Thu, 14 Dec 2023 01:35:04 +0900 Subject: [PATCH 2/3] Update DoubleUnwrappedWithAnySetter3277Test.java --- .../deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java index 361fb7e883..0f79a503b2 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java @@ -57,7 +57,11 @@ public void testIsInstanceOfDouble() throws Exception { Holder holder = MAPPER.readValue("{\"value1\": -60.0, \"value2\": -60.0}", Holder.class); + // Validate type assertEquals(Double.class, holder.value1.getClass()); assertEquals(Double.class, holder.holder2.data.get("value2").getClass()); + // Validate value + assertEquals(-60.0, holder.value1); + assertEquals(-60.0, holder.holder2.data.get("value2")); } } From 86f09725a52297a80c3e123dd45829906dd51fdd Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 13 Dec 2023 13:40:37 -0800 Subject: [PATCH 3/3] Move to diff test package; update release notes --- release-notes/CREDITS-2.x | 5 +++++ release-notes/VERSION-2.x | 3 +++ .../UnwrappedDoubleWithAnySetter3277Test.java} | 12 +++++------- 3 files changed, 13 insertions(+), 7 deletions(-) rename src/test/java/com/fasterxml/jackson/databind/{deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java => struct/UnwrappedDoubleWithAnySetter3277Test.java} (87%) diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index 4feb77a474..b3795f684f 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -1672,6 +1672,11 @@ Kevin Baes (BaesKevin@github) as `BigDecimal` when used with `@JsonTypeInfo` and `JsonTypeInfo.As.EXISTING_PROPERTY` (2.16.0) +John Hendrikx (hjohn@github) + * Reported #3277: Combination of `@JsonUnwrapped` and `@JsonAnySetter` results in `BigDecimal` + instead of `Double` + (2.16.0) + David Schlosnagle (schlosna@github) * Contributed #4008: Optimize `ObjectNode` findValue(s) and findParent(s) fast paths (2.16.0) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 293634bb64..8f2d2b1423 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -29,6 +29,9 @@ Project: jackson-databind #3133: Map deserialization results in different numeric classes based on json ordering (BigDecimal / Double) when used in combination with @JsonSubTypes (reported by @mreiterer) +#3277: Combination of `@JsonUnwrapped` and `@JsonAnySetter` results in `BigDecimal` + instead of `Double` + (reported John H) #3251: Generic class with generic field of runtime type `Double` is deserialized as `BigDecimal` when used with `@JsonTypeInfo` and `JsonTypeInfo.As.EXISTING_PROPERTY` (reported by Kevin B) diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java b/src/test/java/com/fasterxml/jackson/databind/struct/UnwrappedDoubleWithAnySetter3277Test.java similarity index 87% rename from src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java rename to src/test/java/com/fasterxml/jackson/databind/struct/UnwrappedDoubleWithAnySetter3277Test.java index 0f79a503b2..0a69e0ca1b 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DoubleUnwrappedWithAnySetter3277Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/struct/UnwrappedDoubleWithAnySetter3277Test.java @@ -1,4 +1,4 @@ -package com.fasterxml.jackson.databind.deser.jdk; +package com.fasterxml.jackson.databind.struct; import java.util.HashMap; import java.util.Map; @@ -17,15 +17,13 @@ /** * Test to verify that [databind#3277] is fixed. */ -public class DoubleUnwrappedWithAnySetter3277Test +public class UnwrappedDoubleWithAnySetter3277Test { - static class Holder { - - private Object value1; + Object value1; @JsonUnwrapped - private Holder2 holder2; + Holder2 holder2; public Object getValue1() { return value1; @@ -37,7 +35,7 @@ public void setValue1(Object value1) { } static class Holder2 { - private Map data = new HashMap<>(); + Map data = new HashMap<>(); @JsonAnyGetter public Map getData() {