From 9a666887d85349b35e0d80885a7c7cb38029467d Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Mon, 24 Oct 2016 17:03:01 -0700 Subject: [PATCH] Fix #1429 --- release-notes/VERSION | 2 ++ .../databind/deser/std/StdKeyDeserializer.java | 3 ++- .../databind/introspect/BasicBeanDescription.java | 14 ++++++++------ .../deser}/KeyDeser1429Test.java | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) rename src/test/java/com/fasterxml/jackson/{failing => databind/deser}/KeyDeser1429Test.java (96%) diff --git a/release-notes/VERSION b/release-notes/VERSION index 08a8e38021..1a330e9bb6 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -7,6 +7,8 @@ Project: jackson-databind 2.8.5 (not yet released) #1417: Further issues with `@JsonInclude` with `NON_DEFAULT` +#1429: `StdKeyDeserializer` can erroneously use a static factory method + with more than one argument - Improvements to #1411 fix to ensure consistent `null` key handling 2.8.4 (14-Oct-2016) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdKeyDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdKeyDeserializer.java index b43c092155..5e353d3884 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdKeyDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdKeyDeserializer.java @@ -125,7 +125,8 @@ public Object deserializeKey(String key, DeserializationContext ctxt) return result; } } catch (Exception re) { - return ctxt.handleWeirdKey(_keyClass, key, "not a valid representation, problem: %s", re.getMessage()); + return ctxt.handleWeirdKey(_keyClass, key, "not a valid representation, problem: (%s) %s", + re.getClass().getName(), re.getMessage()); } if (_keyClass.isEnum() && ctxt.getConfig().isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL)) { return null; diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/BasicBeanDescription.java b/src/main/java/com/fasterxml/jackson/databind/introspect/BasicBeanDescription.java index 5f16ff55cb..7f8e76d044 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/BasicBeanDescription.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/BasicBeanDescription.java @@ -521,7 +521,8 @@ public Method findFactoryMethod(Class... expArgTypes) { // So, of all single-arg static methods: for (AnnotatedMethod am : _classInfo.getStaticMethods()) { - if (isFactoryMethod(am)) { + // 24-Oct-2016, tatu: Better ensure it only takes 1 arg, no matter what + if (isFactoryMethod(am) && am.getParameterCount() == 1) { // And must take one of expected arg types (or supertype) Class actualArgType = am.getRawParameterType(0); for (Class expArgType : expArgTypes) { @@ -538,14 +539,12 @@ public Method findFactoryMethod(Class... expArgTypes) protected boolean isFactoryMethod(AnnotatedMethod am) { /* First: return type must be compatible with the introspected class - * (i.e. allowed to be sub-class, although usually is the same - * class) + * (i.e. allowed to be sub-class, although usually is the same class) */ Class rt = am.getRawReturnType(); if (!getBeanClass().isAssignableFrom(rt)) { return false; } - /* Also: must be a recognized factory method, meaning: * (a) marked with @JsonCreator annotation, or * (b) "valueOf" (at this point, need not be public) @@ -554,12 +553,15 @@ protected boolean isFactoryMethod(AnnotatedMethod am) return true; } final String name = am.getName(); + // 24-Oct-2016, tatu: As per [databind#1429] must ensure takes exactly one arg if ("valueOf".equals(name)) { - return true; + if (am.getParameterCount() == 1) { + return true; + } } // [databind#208] Also accept "fromString()", if takes String or CharSequence if ("fromString".equals(name)) { - if (1 == am.getParameterCount()) { + if (am.getParameterCount() == 1) { Class cls = am.getRawParameterType(0); if (cls == String.class || CharSequence.class.isAssignableFrom(cls)) { return true; diff --git a/src/test/java/com/fasterxml/jackson/failing/KeyDeser1429Test.java b/src/test/java/com/fasterxml/jackson/databind/deser/KeyDeser1429Test.java similarity index 96% rename from src/test/java/com/fasterxml/jackson/failing/KeyDeser1429Test.java rename to src/test/java/com/fasterxml/jackson/databind/deser/KeyDeser1429Test.java index ffce81d4d2..7922928a2a 100644 --- a/src/test/java/com/fasterxml/jackson/failing/KeyDeser1429Test.java +++ b/src/test/java/com/fasterxml/jackson/databind/deser/KeyDeser1429Test.java @@ -1,4 +1,4 @@ -package com.fasterxml.jackson.failing; +package com.fasterxml.jackson.databind.deser; import java.util.Map;