diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-06-20 19:45:09 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-06-20 19:45:09 -0700 |
commit | 83c50543488502ef6f7b6f32f82f6fccd09a1f8b (patch) | |
tree | f2ce05d93ca129618ad442d1956cdecc7246054d /src/main/java | |
parent | 65c81af00cdfc9af51f89d249061acca6f9b68b5 (diff) | |
parent | d6625925a22af0ac58d38a0aa5e109e43f5a0fda (diff) | |
download | jackson-databind-83c50543488502ef6f7b6f32f82f6fccd09a1f8b.tar.gz |
Merge branch '2.11' into 2.12
Diffstat (limited to 'src/main/java')
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java | 5 | ||||
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java | 75 |
2 files changed, 74 insertions, 6 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java b/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java index caa2663c6..075a87dba 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java @@ -224,12 +224,15 @@ public abstract class BeanPropertyDefinition * the highest precedence in current context (getter method when serializing, * if available, and so forth), if any. *<p> + * Note: may throw {@link IllegalArgumentException} in case problems are found + * trying to getter or setter info. + *<p> * Note: abstract since 2.5 * * @since 2.1 */ public abstract AnnotatedMember getPrimaryMember(); - + /* /********************************************************** /* More refined access to configuration features diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java index c16d09fd4..0dc221490 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java @@ -239,16 +239,20 @@ public class POJOPropertyBuilder * Helper method that contains logic for accessing and merging all setter * information that we needed, regarding things like possible merging * of property value, and handling of incoming nulls. + * Only called for deserialization purposes. */ protected PropertyMetadata _getSetterInfo(PropertyMetadata metadata) { boolean needMerge = true; Nulls valueNulls = null; Nulls contentNulls = null; - + // Slightly confusing: first, annotations should be accessed via primary member - // (mutator); but accessor is needed for actual merge operation. So: - AnnotatedMember prim = getPrimaryMember(); + // (mutator); but accessor is needed for actual merge operation. So + + // 20-Jun-2020, tatu: Unfortunately strict checks lead to [databind#2757] + // so we will need to try to avoid them at this point + AnnotatedMember prim = getPrimaryMemberUnchecked(); AnnotatedMember acc = getAccessor(); if (prim != null) { @@ -272,7 +276,10 @@ public class POJOPropertyBuilder // If not, config override? // 25-Oct-2016, tatu: Either this, or type of accessor... if (needMerge || (valueNulls == null) || (contentNulls == null)) { - Class<?> rawType = getRawPrimaryType(); + // 20-Jun-2020, tatu: Related to [databind#2757], need to find type + // but keeping mind that type for setters is trickier; and that + // generic typing gets tricky as well. + Class<?> rawType = _rawTypeOf(prim); ConfigOverride co = _config.getConfigOverride(rawType); JsonSetter.Value setterInfo = co.getSetterInfo(); if (setterInfo != null) { @@ -330,7 +337,6 @@ public class POJOPropertyBuilder // 09-Feb-2017, tatu: Not sure if this or `null` but... return TypeFactory.unknownType(); } - return m.getType(); } return m.getType(); } @@ -577,6 +583,45 @@ public class POJOPropertyBuilder return m; } + // Sometimes we need to actually by-pass failures related to conflicting + // getters or setters (see [databind#2757] for specific example); if so, + // this method is to be used instead of `getPrimaryMember()` + // @since 2.11.1 + protected AnnotatedMember getPrimaryMemberUnchecked() { + if (_forSerialization) { // Inlined `getAccessor()` logic: + // Inlined `getGetter()`: + if (_getters != null) { + return _getters.value; + } + // Inlined `getField()`: + if (_fields != null) { + return _fields.value; + } + return null; + } + + // Otherwise, inlined `getMutator()` logic: + + // Inlined `getConstructorParameter()`: + if (_ctorParameters != null) { + return _ctorParameters.value; + } + // Inlined `getSetter()`: + if (_setters != null) { + return _setters.value; + } + // Inlined `getField()`: + if (_fields != null) { + return _fields.value; + } + // but to support setterless-properties, also include part of + // `getAccessor()` not yet covered, `getGetter()`: + if (_getters != null) { + return _getters.value; + } + return null; + } + protected int _getterPriority(AnnotatedMethod m) { final String name = m.getName(); @@ -1237,6 +1282,26 @@ public class POJOPropertyBuilder return null; } + // Helper method needed to work around oddity in type access for + // `AnnotatedMethod`. + // + // @since 2.11.1 + protected Class<?> _rawTypeOf(AnnotatedMember m) { + // AnnotatedMethod always returns return type, but for setters we + // actually need argument type + if (m instanceof AnnotatedMethod) { + AnnotatedMethod meh = (AnnotatedMethod) m; + if (meh.getParameterCount() > 0) { + // note: get raw type FROM full type since only that resolves + // generic types + return meh.getParameterType(0).getRawClass(); + } + } + // same as above, must get fully resolved type to handled generic typing + // of fields etc. + return m.getType().getRawClass(); + } + /* /********************************************************** /* Helper classes |