aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2020-04-15 17:27:16 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2020-04-15 17:27:16 -0700
commitbf3270d7c656693c3afcf30bb4b59322c3049aa7 (patch)
tree4ed7ef322982d15ef25a357ce6cdf358fa243feb
parent90aa990cc878d42f4040b0201ba5f6c5e49c363b (diff)
downloadjackson-databind-bf3270d7c656693c3afcf30bb4b59322c3049aa7.tar.gz
Some preparatory work for #2678
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java8
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java5
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java34
-rw-r--r--src/test/java/com/fasterxml/jackson/failing/JacksonInject2465Test.java2
-rw-r--r--src/test/java/com/fasterxml/jackson/failing/JacksonInject2678Test.java17
5 files changed, 61 insertions, 5 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..85be2e9b6 100644
--- a/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java
+++ b/src/main/java/com/fasterxml/jackson/databind/introspect/BeanPropertyDefinition.java
@@ -2,6 +2,7 @@ package com.fasterxml.jackson.databind.introspect;
import java.util.Iterator;
+import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.*;
@@ -259,6 +260,13 @@ public abstract class BeanPropertyDefinition
}
/**
+ * @since 2.11
+ */
+ public JacksonInject.Value findValueInjection() {
+ return null;
+ }
+
+ /**
* Method used to check whether this logical property has a marker
* to indicate it should be used as the type id for polymorphic type
* handling.
diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java
index 88a40e26f..cf70f0c3f 100644
--- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java
+++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java
@@ -326,7 +326,6 @@ public class POJOPropertiesCollector
if (!_classDef.isNonStaticInnerClass()) {
_addCreators(props);
}
- _addInjectables(props);
// Remove ignored properties, first; this MUST precede annotation merging
// since logic relies on knowing exactly which accessor has which annotation
@@ -337,6 +336,10 @@ public class POJOPropertiesCollector
// Rename remaining properties
_renameProperties(props);
+ // and now add injectables, but taking care to avoid overlapping ones
+ // via creator and regular properties
+ _addInjectables(props);
+
// then merge annotations, to simplify further processing
// 26-Sep-2017, tatu: Before 2.9.2 was done earlier but that prevented some of
// annotations from getting properly merged
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 dc37e282f..04a29d94e 100644
--- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java
+++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertyBuilder.java
@@ -2,6 +2,7 @@ package com.fasterxml.jackson.databind.introspect;
import java.util.*;
+import com.fasterxml.jackson.annotation.JacksonInject;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSetter;
@@ -30,6 +31,13 @@ public class POJOPropertyBuilder
AnnotationIntrospector.ReferenceProperty.managed("");
/**
+ * Marker value for case of "no value injection found"
+ *
+ * @since 2.11
+ */
+ private final static JacksonInject.Value NO_VALUE_INJECTION = JacksonInject.Value.empty();
+
+ /**
* Whether property is being composed for serialization
* (true) or deserialization (false)
*/
@@ -70,6 +78,13 @@ public class POJOPropertyBuilder
*/
protected transient AnnotationIntrospector.ReferenceProperty _referenceInfo;
+ /**
+ * Lazily accessed information about value injection information.
+ *
+ * @since 2.11
+ */
+ protected transient JacksonInject.Value _injectedValue;
+
public POJOPropertyBuilder(MapperConfig<?> config, AnnotationIntrospector ai,
boolean forSerialization, PropertyName internalName) {
this(config, ai, forSerialization, internalName, internalName);
@@ -638,6 +653,25 @@ public class POJOPropertyBuilder
}
@Override
+ public JacksonInject.Value findValueInjection() {
+// protected transient ;
+ JacksonInject.Value result = _injectedValue;
+ if (result != null) {
+ if (result == NO_VALUE_INJECTION) {
+ return null;
+ }
+ }
+ result = fromMemberAnnotations(new WithMember<JacksonInject.Value>() {
+ @Override
+ public JacksonInject.Value withMember(AnnotatedMember member) {
+ return _annotationIntrospector.findInjectableValue(member);
+ }
+ });
+ _injectedValue = (result == null) ? NO_VALUE_INJECTION : result;
+ return result;
+ }
+
+ @Override
public boolean isTypeId() {
Boolean b = fromMemberAnnotations(new WithMember<Boolean>() {
@Override
diff --git a/src/test/java/com/fasterxml/jackson/failing/JacksonInject2465Test.java b/src/test/java/com/fasterxml/jackson/failing/JacksonInject2465Test.java
index d92e01ba1..8ec2d67e6 100644
--- a/src/test/java/com/fasterxml/jackson/failing/JacksonInject2465Test.java
+++ b/src/test/java/com/fasterxml/jackson/failing/JacksonInject2465Test.java
@@ -10,8 +10,10 @@ import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.*;
+// [databind#2465]
public class JacksonInject2465Test extends BaseMapTest
{
+ // [databind#2465]
public static final class TestCase2465 {
private final Internal2465 str;
private final int id;
diff --git a/src/test/java/com/fasterxml/jackson/failing/JacksonInject2678Test.java b/src/test/java/com/fasterxml/jackson/failing/JacksonInject2678Test.java
index f8c23da7d..9ca2bca29 100644
--- a/src/test/java/com/fasterxml/jackson/failing/JacksonInject2678Test.java
+++ b/src/test/java/com/fasterxml/jackson/failing/JacksonInject2678Test.java
@@ -9,19 +9,21 @@ import com.fasterxml.jackson.annotation.OptBoolean;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.json.JsonMapper;
+// [databind#2678]: constructor-passed data overridden via field/setter injection
public class JacksonInject2678Test extends BaseMapTest
{
+ // [databind#2678]
protected static class Some {
- private final String field1;
+ private String field1;
- @JacksonInject(value = "defaultValueForField2", useInput = OptBoolean.TRUE)
- private final String field2;
+ private String field2;
public Some(@JsonProperty("field1") final String field1,
@JsonProperty("field2")
@JacksonInject(value = "defaultValueForField2", useInput = OptBoolean.TRUE)
final String field2) {
- this.field1 = Objects.requireNonNull(field1);
+//System.err.println("CTOR: setField2 as ["+field2+"]");
+ this.field1 = Objects.requireNonNull(field1);
this.field2 = Objects.requireNonNull(field2);
}
@@ -32,8 +34,15 @@ public class JacksonInject2678Test extends BaseMapTest
public String getField2() {
return field2;
}
+
+ @JacksonInject(value = "defaultValueForField2", useInput = OptBoolean.TRUE)
+ public void setField2(String v) {
+//System.err.println("DEBUG: setField2, was ["+field2+"], set to ["+v+"]");
+ field2 = v;
+ }
}
+ // [databind#2678]
public void testReadValueInjectables() throws Exception {
final InjectableValues injectableValues =
new InjectableValues.Std().addValue("defaultValueForField2", "somedefaultValue");