diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-04-15 17:27:16 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2020-04-15 17:27:16 -0700 |
commit | bf3270d7c656693c3afcf30bb4b59322c3049aa7 (patch) | |
tree | 4ed7ef322982d15ef25a357ce6cdf358fa243feb | |
parent | 90aa990cc878d42f4040b0201ba5f6c5e49c363b (diff) | |
download | jackson-databind-bf3270d7c656693c3afcf30bb4b59322c3049aa7.tar.gz |
Some preparatory work for #2678
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"); |