aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2020-06-20 19:45:09 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2020-06-20 19:45:09 -0700
commit83c50543488502ef6f7b6f32f82f6fccd09a1f8b (patch)
treef2ce05d93ca129618ad442d1956cdecc7246054d /src/main/java
parent65c81af00cdfc9af51f89d249061acca6f9b68b5 (diff)
parentd6625925a22af0ac58d38a0aa5e109e43f5a0fda (diff)
downloadjackson-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.java5
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java75
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