aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java')
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java65
1 files changed, 58 insertions, 7 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java
index b059782e9..4a0fb1f14 100644
--- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java
+++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java
@@ -136,6 +136,11 @@ public abstract class BeanDeserializerBase
final protected Set<String> _ignorableProps;
/**
+ * Keep track of the the properties that needs to be specifically included.
+ */
+ final protected Set<String> _includableProps;
+
+ /**
* Flag that can be set to ignore and skip unknown properties.
* If set, will not throw an exception for unknown properties.
*/
@@ -201,6 +206,7 @@ public abstract class BeanDeserializerBase
BeanDescription beanDesc,
BeanPropertyMap properties, Map<String, SettableBeanProperty> backRefs,
Set<String> ignorableProps, boolean ignoreAllUnknown,
+ Set<String> includableProps,
boolean hasViews)
{
super(beanDesc.getType());
@@ -211,6 +217,7 @@ public abstract class BeanDeserializerBase
_backRefs = backRefs;
_ignorableProps = ignorableProps;
_ignoreAllUnknown = ignoreAllUnknown;
+ _includableProps = includableProps;
_anySetter = builder.getAnySetter();
List<ValueInjector> injectables = builder.getInjectables();
@@ -263,6 +270,7 @@ public abstract class BeanDeserializerBase
_backRefs = src._backRefs;
_ignorableProps = src._ignorableProps;
_ignoreAllUnknown = ignoreAllUnknown;
+ _includableProps = src._includableProps;
_anySetter = src._anySetter;
_injectables = src._injectables;
_objectIdReader = src._objectIdReader;
@@ -288,6 +296,7 @@ public abstract class BeanDeserializerBase
_backRefs = src._backRefs;
_ignorableProps = src._ignorableProps;
_ignoreAllUnknown = (unwrapper != null) || src._ignoreAllUnknown;
+ _includableProps = src._includableProps;
_anySetter = src._anySetter;
_injectables = src._injectables;
_objectIdReader = src._objectIdReader;
@@ -325,6 +334,7 @@ public abstract class BeanDeserializerBase
_backRefs = src._backRefs;
_ignorableProps = src._ignorableProps;
_ignoreAllUnknown = src._ignoreAllUnknown;
+ _includableProps = src._includableProps;
_anySetter = src._anySetter;
_injectables = src._injectables;
@@ -352,6 +362,14 @@ public abstract class BeanDeserializerBase
public BeanDeserializerBase(BeanDeserializerBase src, Set<String> ignorableProps)
{
+ this(src, ignorableProps, src._includableProps);
+ }
+
+ /**
+ * @since 2.12
+ */
+ public BeanDeserializerBase(BeanDeserializerBase src, Set<String> ignorableProps, Set<String> includableProps)
+ {
super(src._beanType);
_beanType = src._beanType;
@@ -362,6 +380,7 @@ public abstract class BeanDeserializerBase
_backRefs = src._backRefs;
_ignorableProps = ignorableProps;
_ignoreAllUnknown = src._ignoreAllUnknown;
+ _includableProps = includableProps;
_anySetter = src._anySetter;
_injectables = src._injectables;
@@ -375,9 +394,10 @@ public abstract class BeanDeserializerBase
// 01-May-2016, tatu: [databind#1217]: Remove properties from mapping,
// to avoid them being deserialized
- _beanProperties = src._beanProperties.withoutProperties(ignorableProps);
+ _beanProperties = src._beanProperties.withoutProperties(ignorableProps, includableProps);
}
+
/**
* @since 2.8
*/
@@ -394,6 +414,7 @@ public abstract class BeanDeserializerBase
_backRefs = src._backRefs;
_ignorableProps = src._ignorableProps;
_ignoreAllUnknown = src._ignoreAllUnknown;
+ _includableProps = src._includableProps;
_anySetter = src._anySetter;
_injectables = src._injectables;
_objectIdReader = src._objectIdReader;
@@ -411,7 +432,21 @@ public abstract class BeanDeserializerBase
public abstract BeanDeserializerBase withObjectIdReader(ObjectIdReader oir);
- public abstract BeanDeserializerBase withIgnorableProperties(Set<String> ignorableProps);
+ public BeanDeserializerBase withIgnorableProperties(Set<String> ignorableProps) {
+ return withIgnorableProperties(ignorableProps, _includableProps);
+ }
+
+ /**
+ * @since 2.12
+ */
+ public abstract BeanDeserializerBase withIgnorableProperties(Set<String> ignorableProps, Set<String> includableProps);
+
+ /**
+ * @since 2.12
+ */
+ public BeanDeserializerBase withIncludableProperties(Set<String> includableProperties) {
+ return withIgnorableProperties(_ignorableProps, includableProperties);
+ }
// NOTE! To be made `abstract` in 2.12 or later
/**
@@ -422,7 +457,7 @@ public abstract class BeanDeserializerBase
if (ignoreUnknown == _ignoreAllUnknown) {
return this;
}
- return withIgnorableProperties(_ignorableProps);
+ return withIgnorableProperties(_ignorableProps, _includableProps);
}
/**
@@ -469,10 +504,10 @@ public abstract class BeanDeserializerBase
// 22-Jan-2018, tatu: May need to propagate "ignorable" status (from `Access.READ_ONLY`
// or perhaps class-ignorables) into Creator properties too. Can not just delete,
// at this point, but is needed for further processing down the line
- if (_ignorableProps != null) {
+ if (_ignorableProps != null || _includableProps != null) {
for (int i = 0, end = creatorProps.length; i < end; ++i) {
SettableBeanProperty prop = creatorProps[i];
- if (_ignorableProps.contains(prop.getName())) {
+ if (IgnorePropertiesUtil.shouldIgnore(prop.getName(), _ignorableProps, _includableProps)) {
creatorProps[i].markAsIgnorable();
}
}
@@ -773,6 +808,21 @@ public abstract class BeanDeserializerBase
contextual = contextual.withIgnoreAllUnknown(true);
}
}
+ JsonIncludeProperties.Value inclusions = intr.findPropertyInclusions(accessor);
+ if (inclusions != null) {
+ Set<String> included = inclusions.getIncluded();
+ Set<String> prev = contextual._includableProps;
+ if (prev != null && included != null) {
+ Set<String> newIncluded = new HashSet<>();
+ // Make the intersection with the previously included properties.
+ for(String prop : prev) {
+ if (included.contains(prop)) {
+ newIncluded.add(prop);
+ }
+ }
+ contextual = contextual.withIncludableProperties(newIncluded);
+ }
+ }
}
// One more thing: are we asked to serialize POJO as array?
@@ -1601,7 +1651,8 @@ public abstract class BeanDeserializerBase
Object beanOrBuilder, String propName)
throws IOException
{
- if (_ignorableProps != null && _ignorableProps.contains(propName)) {
+
+ if (IgnorePropertiesUtil.shouldIgnore(propName, _ignorableProps, _includableProps)) {
handleIgnoredProperty(p, ctxt, beanOrBuilder, propName);
} else if (_anySetter != null) {
try {
@@ -1629,7 +1680,7 @@ public abstract class BeanDeserializerBase
p.skipChildren();
return;
}
- if (_ignorableProps != null && _ignorableProps.contains(propName)) {
+ if (IgnorePropertiesUtil.shouldIgnore(propName, _ignorableProps, _includableProps)) {
handleIgnoredProperty(p, ctxt, beanOrClass, propName);
}
// Otherwise use default handling (call handler(s); if not