From f787c4576f11b773cc6e40f397d6239dc1f831af Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sun, 16 Nov 2025 17:25:21 -0800 Subject: [PATCH 1/6] Fix #1419: allow Map.Entry shape/format overrides --- .../deser/BasicDeserializerFactory.java | 7 ++ .../deser/jdk/MapEntryDeserializer.java | 115 +++++++++++++++++- .../databind/ser/BasicSerializerFactory.java | 4 +- .../MapEntryFormat1419Test.java | 6 +- 4 files changed, 126 insertions(+), 6 deletions(-) rename src/test/java/tools/jackson/databind/{tofix => format}/MapEntryFormat1419Test.java (86%) diff --git a/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java b/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java index e7585cd05f..b59ea77a67 100644 --- a/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java +++ b/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java @@ -1418,6 +1418,13 @@ public ValueDeserializer findDefaultDeserializer(DeserializationContext ctxt, return createCollectionDeserializer(ctxt, ct, beanDescRef); } if (rawType == CLASS_MAP_ENTRY) { + // [databind#1419]: Check if we should deserialize as POJO instead + JsonFormat.Value format = beanDescRef.findExpectedFormat(Map.Entry.class); + if ((format.getShape() == JsonFormat.Shape.POJO) + || (format.getShape() == JsonFormat.Shape.OBJECT)) { + // Let it fall through to be deserialized as a Bean/POJO + return null; + } // 28-Apr-2015, tatu: TypeFactory does it all for us already so JavaType kt = type.containedTypeOrUnknown(0); JavaType vt = type.containedTypeOrUnknown(1); diff --git a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java index a05df30bef..f2c0876bb7 100644 --- a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java +++ b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java @@ -2,6 +2,8 @@ import java.util.*; +import com.fasterxml.jackson.annotation.JsonFormat; + import tools.jackson.core.*; import tools.jackson.databind.*; import tools.jackson.databind.annotation.JacksonStdImpl; @@ -43,6 +45,14 @@ public class MapEntryDeserializer */ protected final TypeDeserializer _valueTypeDeserializer; + /** + * Flag set when we should deserialize as POJO with "key" and "value" + * properties, instead of the default Map.Entry format. + * + * @since 3.1 (for [databind#1419]) + */ + protected final boolean _deserializeAsPOJO; + /* /********************************************************************** /* Life-cycle @@ -52,6 +62,13 @@ public class MapEntryDeserializer public MapEntryDeserializer(JavaType type, KeyDeserializer keyDeser, ValueDeserializer valueDeser, TypeDeserializer valueTypeDeser) + { + this(type, keyDeser, valueDeser, valueTypeDeser, false); + } + + protected MapEntryDeserializer(JavaType type, + KeyDeserializer keyDeser, ValueDeserializer valueDeser, + TypeDeserializer valueTypeDeser, boolean deserializeAsPOJO) { super(type); if (type.containedTypeCount() != 2) { // sanity check @@ -60,6 +77,7 @@ public MapEntryDeserializer(JavaType type, _keyDeserializer = keyDeser; _valueDeserializer = valueDeser; _valueTypeDeserializer = valueTypeDeser; + _deserializeAsPOJO = deserializeAsPOJO; } /** @@ -72,6 +90,7 @@ protected MapEntryDeserializer(MapEntryDeserializer src) _keyDeserializer = src._keyDeserializer; _valueDeserializer = src._valueDeserializer; _valueTypeDeserializer = src._valueTypeDeserializer; + _deserializeAsPOJO = src._deserializeAsPOJO; } protected MapEntryDeserializer(MapEntryDeserializer src, @@ -82,6 +101,7 @@ protected MapEntryDeserializer(MapEntryDeserializer src, _keyDeserializer = keyDeser; _valueDeserializer = valueDeser; _valueTypeDeserializer = valueTypeDeser; + _deserializeAsPOJO = src._deserializeAsPOJO; } /** @@ -121,6 +141,19 @@ public LogicalType logicalType() { public ValueDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) { + // [databind#1419]: Check if property has @JsonFormat(shape=OBJECT/POJO) + boolean deserializeAsPOJO = _deserializeAsPOJO; + if (property != null) { + JsonFormat.Value format = ctxt.getAnnotationIntrospector() + .findFormat(ctxt.getConfig(), property.getMember()); + if (format != null) { + if ((format.getShape() == JsonFormat.Shape.POJO) + || (format.getShape() == JsonFormat.Shape.OBJECT)) { + deserializeAsPOJO = true; + } + } + } + KeyDeserializer kd = _keyDeserializer; if (kd == null) { kd = ctxt.findKeyDeserializer(_containerType.containedType(0), property); @@ -141,7 +174,13 @@ public ValueDeserializer createContextual(DeserializationContext ctxt, if (vtd != null) { vtd = vtd.forProperty(property); } - return withResolved(kd, vtd, vd); + + MapEntryDeserializer deser = withResolved(kd, vtd, vd); + if (deserializeAsPOJO != _deserializeAsPOJO) { + return new MapEntryDeserializer(_containerType, kd, + (ValueDeserializer) vd, vtd, deserializeAsPOJO); + } + return deser; } /* @@ -174,6 +213,11 @@ public ValueDeserializer getContentDeserializer() { public Map.Entry deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException { + // [databind#1419]: If deserializing as POJO with "key" and "value" properties + if (_deserializeAsPOJO) { + return _deserializeAsPOJO(p, ctxt); + } + // Ok: must point to START_OBJECT, PROPERTY_NAME or END_OBJECT JsonToken t = p.currentToken(); if (t == JsonToken.START_OBJECT) { @@ -232,6 +276,75 @@ public Map.Entry deserialize(JsonParser p, DeserializationContext return new AbstractMap.SimpleEntry(key, value); } + /** + * Helper method to deserialize Map.Entry as POJO with "key" and "value" properties. + * + * @since 3.1 (for [databind#1419]) + */ + protected Map.Entry _deserializeAsPOJO(JsonParser p, DeserializationContext ctxt) + throws JacksonException + { + JsonToken t = p.currentToken(); + if (t == JsonToken.START_OBJECT) { + t = p.nextToken(); + } else if (t != JsonToken.PROPERTY_NAME && t != JsonToken.END_OBJECT) { + if (t == JsonToken.START_ARRAY) { + return _deserializeFromArray(p, ctxt); + } + return (Map.Entry) ctxt.handleUnexpectedToken(getValueType(ctxt), p); + } + + final KeyDeserializer keyDes = _keyDeserializer; + final ValueDeserializer valueDes = _valueDeserializer; + final TypeDeserializer typeDeser = _valueTypeDeserializer; + + Object key = null; + Object value = null; + + // Read properties "key" and "value" + while (t == JsonToken.PROPERTY_NAME) { + String propName = p.currentName(); + t = p.nextToken(); // move to value + + if ("key".equals(propName)) { + // Deserialize key + if (t == JsonToken.VALUE_NULL) { + key = keyDes.deserializeKey(null, ctxt); + } else if (t.isScalarValue()) { + key = keyDes.deserializeKey(p.getText(), ctxt); + } else { + ctxt.reportInputMismatch(this, + "Can not deserialize Map.Entry key from non-scalar JSON value"); + } + } else if ("value".equals(propName)) { + // Deserialize value + try { + if (t == JsonToken.VALUE_NULL) { + value = valueDes.getNullValue(ctxt); + } else if (typeDeser == null) { + value = valueDes.deserialize(p, ctxt); + } else { + value = valueDes.deserializeWithType(p, ctxt, typeDeser); + } + } catch (Exception e) { + wrapAndThrow(ctxt, e, Map.Entry.class, propName); + } + } else { + // Unknown property: check if we should fail or skip + handleUnknownProperty(p, ctxt, _containerType.getRawClass(), propName); + } + + t = p.nextToken(); // move to next property or END_OBJECT + } + + if (t != JsonToken.END_OBJECT) { + ctxt.reportInputMismatch(this, + "Problem binding JSON into Map.Entry: unexpected content: "+t); + } + + return new AbstractMap.SimpleEntry(key, value); + } + @Override public Map.Entry deserialize(JsonParser p, DeserializationContext ctxt, Map.Entry result) throws JacksonException diff --git a/src/main/java/tools/jackson/databind/ser/BasicSerializerFactory.java b/src/main/java/tools/jackson/databind/ser/BasicSerializerFactory.java index 5fd8b13184..460bd752df 100644 --- a/src/main/java/tools/jackson/databind/ser/BasicSerializerFactory.java +++ b/src/main/java/tools/jackson/databind/ser/BasicSerializerFactory.java @@ -784,7 +784,9 @@ protected ValueSerializer buildMapEntrySerializer(SerializationContext ctxt, { // [databind#865]: Allow serialization "as POJO" -- note: to undo, declare // serialization as `Shape.NATURAL` instead; that's JSON Object too. - if (effectiveFormat.getShape() == JsonFormat.Shape.POJO) { + // [databind#1419]: Also allow `Shape.OBJECT` to work the same way + if ((effectiveFormat.getShape() == JsonFormat.Shape.POJO) + || (effectiveFormat.getShape() == JsonFormat.Shape.OBJECT)) { return null; } MapEntrySerializer ser = new MapEntrySerializer(valueType, keyType, diff --git a/src/test/java/tools/jackson/databind/tofix/MapEntryFormat1419Test.java b/src/test/java/tools/jackson/databind/format/MapEntryFormat1419Test.java similarity index 86% rename from src/test/java/tools/jackson/databind/tofix/MapEntryFormat1419Test.java rename to src/test/java/tools/jackson/databind/format/MapEntryFormat1419Test.java index d1efd80860..e9ca9f22d1 100644 --- a/src/test/java/tools/jackson/databind/tofix/MapEntryFormat1419Test.java +++ b/src/test/java/tools/jackson/databind/format/MapEntryFormat1419Test.java @@ -1,4 +1,4 @@ -package tools.jackson.databind.tofix; +package tools.jackson.databind.format; import java.util.HashMap; import java.util.Map; @@ -9,12 +9,11 @@ import tools.jackson.databind.*; import tools.jackson.databind.testutil.DatabindTestUtil; -import tools.jackson.databind.testutil.failure.JacksonTestFailureExpected; import static org.junit.jupiter.api.Assertions.assertEquals; // for [databind#1419] -class MapEntryFormat1419Test extends DatabindTestUtil { +public class MapEntryFormat1419Test extends DatabindTestUtil { static class BeanWithMapEntryAsObject { @JsonFormat(shape = JsonFormat.Shape.OBJECT) public Map.Entry entry; @@ -31,7 +30,6 @@ public BeanWithMapEntryAsObject(String key, String value) { private final ObjectMapper MAPPER = newJsonMapper(); - @JacksonTestFailureExpected @Test void wrappedAsObjectRoundtrip() throws Exception { BeanWithMapEntryAsObject input = new BeanWithMapEntryAsObject("foo", "bar"); From 2345eb4d2bbae15fc7e3a8cc3b0de9a3e8552ac6 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sun, 16 Nov 2025 17:44:36 -0800 Subject: [PATCH 2/6] Minor tweaking --- .../deser/jdk/MapEntryDeserializer.java | 33 +++++++------------ 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java index f2c0876bb7..60609b003b 100644 --- a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java +++ b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java @@ -80,19 +80,6 @@ protected MapEntryDeserializer(JavaType type, _deserializeAsPOJO = deserializeAsPOJO; } - /** - * Copy-constructor that can be used by sub-classes to allow - * copy-on-write styling copying of settings of an existing instance. - */ - protected MapEntryDeserializer(MapEntryDeserializer src) - { - super(src); - _keyDeserializer = src._keyDeserializer; - _valueDeserializer = src._valueDeserializer; - _valueTypeDeserializer = src._valueTypeDeserializer; - _deserializeAsPOJO = src._deserializeAsPOJO; - } - protected MapEntryDeserializer(MapEntryDeserializer src, KeyDeserializer keyDeser, ValueDeserializer valueDeser, TypeDeserializer valueTypeDeser) @@ -144,13 +131,17 @@ public ValueDeserializer createContextual(DeserializationContext ctxt, // [databind#1419]: Check if property has @JsonFormat(shape=OBJECT/POJO) boolean deserializeAsPOJO = _deserializeAsPOJO; if (property != null) { - JsonFormat.Value format = ctxt.getAnnotationIntrospector() - .findFormat(ctxt.getConfig(), property.getMember()); - if (format != null) { - if ((format.getShape() == JsonFormat.Shape.POJO) - || (format.getShape() == JsonFormat.Shape.OBJECT)) { - deserializeAsPOJO = true; - } + JsonFormat.Value format = property.findPropertyFormat(ctxt.getConfig(), Map.Entry.class); + + switch (format.getShape()) { + case NATURAL: + deserializeAsPOJO = false; + break; + case OBJECT: + case POJO: + deserializeAsPOJO = true; + break; + default: // fall through } } @@ -311,7 +302,7 @@ protected Map.Entry _deserializeAsPOJO(JsonParser p, Deserializat if (t == JsonToken.VALUE_NULL) { key = keyDes.deserializeKey(null, ctxt); } else if (t.isScalarValue()) { - key = keyDes.deserializeKey(p.getText(), ctxt); + key = keyDes.deserializeKey(p.getString(), ctxt); } else { ctxt.reportInputMismatch(this, "Can not deserialize Map.Entry key from non-scalar JSON value"); From 18d5c934e541c12bc0f6c2c0c4c9529ff0f25444 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 18 Nov 2025 17:11:31 -0800 Subject: [PATCH 3/6] Streamline --- .../databind/deser/BasicDeserializerFactory.java | 3 +-- .../databind/deser/jdk/MapEntryDeserializer.java | 3 +-- .../jackson/databind/ser/BasicSerializerFactory.java | 4 +--- .../databind/format/MapEntryFormat1419Test.java | 12 ++++++------ 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java b/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java index b59ea77a67..c5a4721fc5 100644 --- a/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java +++ b/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java @@ -1420,8 +1420,7 @@ public ValueDeserializer findDefaultDeserializer(DeserializationContext ctxt, if (rawType == CLASS_MAP_ENTRY) { // [databind#1419]: Check if we should deserialize as POJO instead JsonFormat.Value format = beanDescRef.findExpectedFormat(Map.Entry.class); - if ((format.getShape() == JsonFormat.Shape.POJO) - || (format.getShape() == JsonFormat.Shape.OBJECT)) { + if (format.getShape() == JsonFormat.Shape.POJO) { // Let it fall through to be deserialized as a Bean/POJO return null; } diff --git a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java index 60609b003b..7d3688cff7 100644 --- a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java +++ b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java @@ -128,7 +128,7 @@ public LogicalType logicalType() { public ValueDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) { - // [databind#1419]: Check if property has @JsonFormat(shape=OBJECT/POJO) + // [databind#1419]: Check if property has @JsonFormat(shape=POJO) boolean deserializeAsPOJO = _deserializeAsPOJO; if (property != null) { JsonFormat.Value format = property.findPropertyFormat(ctxt.getConfig(), Map.Entry.class); @@ -137,7 +137,6 @@ public ValueDeserializer createContextual(DeserializationContext ctxt, case NATURAL: deserializeAsPOJO = false; break; - case OBJECT: case POJO: deserializeAsPOJO = true; break; diff --git a/src/main/java/tools/jackson/databind/ser/BasicSerializerFactory.java b/src/main/java/tools/jackson/databind/ser/BasicSerializerFactory.java index 0a3dbca66a..059d42b4ec 100644 --- a/src/main/java/tools/jackson/databind/ser/BasicSerializerFactory.java +++ b/src/main/java/tools/jackson/databind/ser/BasicSerializerFactory.java @@ -784,9 +784,7 @@ protected ValueSerializer buildMapEntrySerializer(SerializationContext ctxt, { // [databind#865]: Allow serialization "as POJO" -- note: to undo, declare // serialization as `Shape.NATURAL` instead; that's JSON Object too. - // [databind#1419]: Also allow `Shape.OBJECT` to work the same way - if ((effectiveFormat.getShape() == JsonFormat.Shape.POJO) - || (effectiveFormat.getShape() == JsonFormat.Shape.OBJECT)) { + if (effectiveFormat.getShape() == JsonFormat.Shape.POJO) { return null; } MapEntrySerializer ser = new MapEntrySerializer(valueType, keyType, diff --git a/src/test/java/tools/jackson/databind/format/MapEntryFormat1419Test.java b/src/test/java/tools/jackson/databind/format/MapEntryFormat1419Test.java index e9ca9f22d1..26788584d4 100644 --- a/src/test/java/tools/jackson/databind/format/MapEntryFormat1419Test.java +++ b/src/test/java/tools/jackson/databind/format/MapEntryFormat1419Test.java @@ -14,14 +14,14 @@ // for [databind#1419] public class MapEntryFormat1419Test extends DatabindTestUtil { - static class BeanWithMapEntryAsObject { - @JsonFormat(shape = JsonFormat.Shape.OBJECT) + static class BeanWithMapEntryAsPOJO { + @JsonFormat(shape = JsonFormat.Shape.POJO) public Map.Entry entry; - protected BeanWithMapEntryAsObject() { + protected BeanWithMapEntryAsPOJO() { } - public BeanWithMapEntryAsObject(String key, String value) { + public BeanWithMapEntryAsPOJO(String key, String value) { Map map = new HashMap<>(); map.put(key, value); entry = map.entrySet().iterator().next(); @@ -32,10 +32,10 @@ public BeanWithMapEntryAsObject(String key, String value) { @Test void wrappedAsObjectRoundtrip() throws Exception { - BeanWithMapEntryAsObject input = new BeanWithMapEntryAsObject("foo", "bar"); + BeanWithMapEntryAsPOJO input = new BeanWithMapEntryAsPOJO("foo", "bar"); String json = MAPPER.writeValueAsString(input); assertEquals(a2q("{'entry':{'key':'foo','value':'bar'}}"), json); - BeanWithMapEntryAsObject result = MAPPER.readValue(json, BeanWithMapEntryAsObject.class); + BeanWithMapEntryAsPOJO result = MAPPER.readValue(json, BeanWithMapEntryAsPOJO.class); assertEquals("foo", result.entry.getKey()); assertEquals("bar", result.entry.getValue()); } From d10fa7b8787e7246f0d4dd37cb0c70ffcaa7c1f4 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 18 Nov 2025 17:12:31 -0800 Subject: [PATCH 4/6] ... --- .../tools/jackson/databind/deser/jdk/MapEntryDeserializer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java index 7d3688cff7..fa9d396aeb 100644 --- a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java +++ b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java @@ -124,6 +124,7 @@ public LogicalType logicalType() { * Method called to finalize setup of this deserializer, * when it is known for which property deserializer is needed for. */ + @SuppressWarnings("unchecked") @Override public ValueDeserializer createContextual(DeserializationContext ctxt, BeanProperty property) @@ -271,6 +272,7 @@ public Map.Entry deserialize(JsonParser p, DeserializationContext * * @since 3.1 (for [databind#1419]) */ + @SuppressWarnings("unchecked") protected Map.Entry _deserializeAsPOJO(JsonParser p, DeserializationContext ctxt) throws JacksonException { From 9f8a82590fb12781235a42111cb1a881fa5f16e5 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 18 Nov 2025 17:14:30 -0800 Subject: [PATCH 5/6] ... --- src/main/java/tools/jackson/databind/ser/BeanPropertyWriter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/tools/jackson/databind/ser/BeanPropertyWriter.java b/src/main/java/tools/jackson/databind/ser/BeanPropertyWriter.java index e04eae4f18..4f596a06b7 100644 --- a/src/main/java/tools/jackson/databind/ser/BeanPropertyWriter.java +++ b/src/main/java/tools/jackson/databind/ser/BeanPropertyWriter.java @@ -4,7 +4,6 @@ import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; -import java.lang.reflect.Method; import java.util.HashMap; import com.fasterxml.jackson.annotation.JsonInclude; From b5197876af4f5d4bd6686ac50d2cf7696395f526 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 18 Nov 2025 17:26:17 -0800 Subject: [PATCH 6/6] ... --- .../databind/deser/BasicDeserializerFactory.java | 12 +++++++----- .../databind/deser/jdk/MapEntryDeserializer.java | 1 - 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java b/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java index c5a4721fc5..b8fdd1ae27 100644 --- a/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java +++ b/src/main/java/tools/jackson/databind/deser/BasicDeserializerFactory.java @@ -1420,10 +1420,7 @@ public ValueDeserializer findDefaultDeserializer(DeserializationContext ctxt, if (rawType == CLASS_MAP_ENTRY) { // [databind#1419]: Check if we should deserialize as POJO instead JsonFormat.Value format = beanDescRef.findExpectedFormat(Map.Entry.class); - if (format.getShape() == JsonFormat.Shape.POJO) { - // Let it fall through to be deserialized as a Bean/POJO - return null; - } + boolean asPOJO = (format.getShape() == JsonFormat.Shape.POJO); // 28-Apr-2015, tatu: TypeFactory does it all for us already so JavaType kt = type.containedTypeOrUnknown(0); JavaType vt = type.containedTypeOrUnknown(1); @@ -1434,7 +1431,12 @@ public ValueDeserializer findDefaultDeserializer(DeserializationContext ctxt, @SuppressWarnings("unchecked") ValueDeserializer valueDeser = (ValueDeserializer) vt.getValueHandler(); KeyDeserializer keyDes = (KeyDeserializer) kt.getValueHandler(); - return new MapEntryDeserializer(type, keyDes, valueDeser, vts); + MapEntryDeserializer meDeser = new MapEntryDeserializer(type, keyDes, valueDeser, vts); + if (asPOJO) { + // !!! 18-Nov-2025, tatu: [databind#1419] TODO -- implement! + ; + } + return meDeser; } String clsName = rawType.getName(); if (rawType.isPrimitive() || clsName.startsWith("java.")) { diff --git a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java index fa9d396aeb..fb352eeda1 100644 --- a/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java +++ b/src/main/java/tools/jackson/databind/deser/jdk/MapEntryDeserializer.java @@ -99,7 +99,6 @@ protected MapEntryDeserializer(MapEntryDeserializer src, protected MapEntryDeserializer withResolved(KeyDeserializer keyDeser, TypeDeserializer valueTypeDeser, ValueDeserializer valueDeser) { - if ((_keyDeserializer == keyDeser) && (_valueDeserializer == valueDeser) && (_valueTypeDeserializer == valueTypeDeser)) { return this;