From 7ff745c4a8c66769fc50b3cdaeb2e1d35327909e Mon Sep 17 00:00:00 2001 From: Cowtowncoder Date: Fri, 27 Mar 2015 13:09:30 -0700 Subject: [PATCH] More complete fix for #735 --- release-notes/VERSION | 8 +++-- .../databind/deser/DeserializerCache.java | 30 +++++++++++++++++-- .../jackson/databind/node/FloatNode.java | 1 - .../deser/TestCustomDeserializers.java | 8 ++--- .../databind/deser/TestForwardReference.java | 13 ++------ 5 files changed, 39 insertions(+), 21 deletions(-) diff --git a/release-notes/VERSION b/release-notes/VERSION index a854f644e3..0750a09baf 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -4,6 +4,11 @@ Project: jackson-databind === Releases === ------------------------------------------------------------------------ +2.4.6 (not yet released) + +#735: (complete fix) @JsonDeserialize on Map with contentUsing custom deserializer overwrites default behavior + (reported by blackfyre512@github) (regression due to #604) + 2.4.5.1 (26-Mar-2015) Special one-off "micro patch" for: @@ -11,8 +16,7 @@ Special one-off "micro patch" for: #706: Add support for `@JsonUnwrapped` via JSON Schema module #707: Error in getting string representation of an ObjectNode with a float number value (reported by @navidqar) -#735: @JsonDeserialize on Map with contentUsing custom deserializer overwrites default behavior - (reported by blackfyre512@github) (regression due to #604) +#735: (partial) @JsonDeserialize on Map with contentUsing custom deserializer overwrites default behavior 2.4.5 (13-Jan-2015) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/DeserializerCache.java b/src/main/java/com/fasterxml/jackson/databind/deser/DeserializerCache.java index 7692bd0470..9a2cbfbcad 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/DeserializerCache.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/DeserializerCache.java @@ -204,6 +204,9 @@ protected JsonDeserializer _findCachedDeserializer(JavaType type) if (type == null) { throw new IllegalArgumentException("Null JavaType passed"); } + if (_hasCustomValueHandler(type)) { + return null; + } return _cachedDeserializers.get(type); } @@ -214,7 +217,7 @@ protected JsonDeserializer _findCachedDeserializer(JavaType type) * @param ctxt Currently active deserialization context * @param type Type of property to deserialize */ - protected JsonDeserializer_createAndCacheValueDeserializer(DeserializationContext ctxt, + protected JsonDeserializer _createAndCacheValueDeserializer(DeserializationContext ctxt, DeserializerFactory factory, JavaType type) throws JsonMappingException { @@ -273,7 +276,8 @@ protected JsonDeserializer _createAndCache2(DeserializationContext ctxt, */ // 08-Jun-2010, tatu: Related to [JACKSON-296], need to avoid caching MapSerializers... so: boolean isResolvable = (deser instanceof ResolvableDeserializer); - boolean addToCache = deser.isCachable(); + // 27-Mar-2015, tatu: As per [databind#735], avoid caching types with custom value desers + boolean addToCache = !_hasCustomValueHandler(type) && deser.isCachable(); /* we will temporarily hold on to all created deserializers (to * handle cyclic references, and possibly reuse non-cached @@ -538,6 +542,26 @@ private JavaType modifyTypeByAnnotation(DeserializationContext ctxt, return type; } + /* + /********************************************************** + /* Helper methods, other + /********************************************************** + */ + + /** + * Helper method used to prevent both caching and cache lookups for structured + * types that have custom value handlers + * + * @since 2.4.6 + */ + private boolean _hasCustomValueHandler(JavaType t) { + if (t.isContainerType()) { + JavaType ct = t.getContentType(); + return (ct != null) && (ct.getValueHandler() != null); + } + return false; + } + private Class _verifyAsClass(Object src, String methodName, Class noneClass) { if (src == null) { @@ -552,7 +576,7 @@ private Class _verifyAsClass(Object src, String methodName, Class noneClas } return cls; } - + /* /********************************************************** /* Overridable error reporting methods diff --git a/src/main/java/com/fasterxml/jackson/databind/node/FloatNode.java b/src/main/java/com/fasterxml/jackson/databind/node/FloatNode.java index 5259cdc9dd..ff9e14303e 100644 --- a/src/main/java/com/fasterxml/jackson/databind/node/FloatNode.java +++ b/src/main/java/com/fasterxml/jackson/databind/node/FloatNode.java @@ -5,7 +5,6 @@ import java.math.BigInteger; import com.fasterxml.jackson.core.*; -import com.fasterxml.jackson.core.io.NumberOutput; import com.fasterxml.jackson.databind.SerializerProvider; /** diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/TestCustomDeserializers.java b/src/test/java/com/fasterxml/jackson/databind/deser/TestCustomDeserializers.java index ce3e76c22f..bef15f1591 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/TestCustomDeserializers.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/TestCustomDeserializers.java @@ -1,16 +1,14 @@ package com.fasterxml.jackson.databind.deser; import java.io.*; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; import java.util.*; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; + import com.fasterxml.jackson.core.*; -import com.fasterxml.jackson.core.type.TypeReference; + import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java b/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java index e4f0af5b7f..8a76a35198 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/TestForwardReference.java @@ -1,20 +1,13 @@ package com.fasterxml.jackson.databind.deser; -import com.fasterxml.jackson.annotation.JsonIdentityInfo; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.ObjectIdGenerators; -import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.annotation.*; + import com.fasterxml.jackson.databind.BaseMapTest; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; /** * Test for testing forward reference handling @@ -67,7 +60,7 @@ public void setId(String id) { } @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY) - private static class YetAnotherClass + static class YetAnotherClass { public YetAnotherClass() {} public ForwardReferenceClass frc;