From 681e39920cc6e19a1aaa26369d26cf06c2a80535 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sat, 25 Jan 2025 19:36:07 -0800 Subject: [PATCH] Fix #4922: @JsonMerge with custom map (#4925) --- release-notes/VERSION-2.x | 2 + .../deser/BasicDeserializerFactory.java | 6 --- .../deser/merge/CustomMapMerge4922Test.java | 40 +++++++++++++++++++ 3 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/fasterxml/jackson/databind/deser/merge/CustomMapMerge4922Test.java diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 80156dd5fb..078580cf28 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -21,6 +21,8 @@ Project: jackson-databind #4908: Deserialization behavior change with @JsonCreator and @ConstructorProperties between 2.17 and 2.18 (reported by Gustavo B) +#4922: Failing `@JsonMerge` with a custom Map + (reported by @nlisker) 2.18.2 (27-Nov-2024) 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 4578b508af..50d6d03055 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java @@ -979,12 +979,6 @@ public JsonDeserializer createMapDeserializer(DeserializationContext ctxt, mapClass = type.getRawClass(); // But if so, also need to re-check creators... beanDesc = config.introspectForCreation(type); - } else { - // [databind#292]: Actually, may be fine, but only if polymorphic deser enabled - if (type.getTypeHandler() == null) { - throw new IllegalArgumentException("Cannot find a deserializer for non-concrete Map type "+type); - } - deser = AbstractDeserializer.constructForNonPOJO(beanDesc); } } else { // 10-Jan-2017, tatu: `java.util.Collections` types need help: diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/merge/CustomMapMerge4922Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/merge/CustomMapMerge4922Test.java new file mode 100644 index 0000000000..d7e6c4fb35 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/deser/merge/CustomMapMerge4922Test.java @@ -0,0 +1,40 @@ +package com.fasterxml.jackson.databind.deser.merge; + +import java.util.*; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.annotation.JsonMerge; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; + +import static org.junit.jupiter.api.Assertions.*; + +@SuppressWarnings("serial") +public class CustomMapMerge4922Test + extends DatabindTestUtil +{ + // [databind#4922] + interface MyMap4922 extends Map {} + + static class MapImpl extends HashMap implements MyMap4922 {} + + static class MergeMap4922 { + @JsonMerge // either here + public MyMap4922 map = new MapImpl<>(); + } + + private final ObjectMapper MAPPER = newJsonMapper(); + + // [databind#4922]: Merge for custom maps fails + @Test + void testJDKMapperReading() throws Exception { + MergeMap4922 input = new MergeMap4922(); + input.map.put(3, "ADS"); + + String json = MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(input); + MergeMap4922 merge2 = MAPPER.readValue(json, MergeMap4922.class); + assertNotNull(merge2); + } + +}