From d57dedce40f513a30bfcae8d87180f2bb2bb4f69 Mon Sep 17 00:00:00 2001 From: Michael Riedel Date: Thu, 28 Feb 2019 14:05:14 +0100 Subject: [PATCH] #2208: Make SubTypeValidator configurable on BeanDeserializerFactory. --- .../cfg/DeserializerFactoryConfig.java | 36 +++++++++++++++---- .../deser/BeanDeserializerFactory.java | 2 +- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig.java b/src/main/java/com/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig.java index 1967ea0012..c0a25f898b 100644 --- a/src/main/java/com/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig.java +++ b/src/main/java/com/fasterxml/jackson/databind/cfg/DeserializerFactoryConfig.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.deser.*; import com.fasterxml.jackson.databind.deser.std.StdKeyDeserializers; +import com.fasterxml.jackson.databind.jsontype.impl.SubTypeValidator; import com.fasterxml.jackson.databind.util.ArrayBuilders; import com.fasterxml.jackson.databind.util.ArrayIterator; @@ -16,6 +17,7 @@ public class DeserializerFactoryConfig protected final static Deserializers[] NO_DESERIALIZERS = new Deserializers[0]; protected final static BeanDeserializerModifier[] NO_MODIFIERS = new BeanDeserializerModifier[0]; protected final static ValueInstantiators[] NO_VALUE_INSTANTIATORS = new ValueInstantiators[0]; + private static final SubTypeValidator DEFAULT_SUBTYPE_VALIDATOR = SubTypeValidator.instance(); /** * By default we plug default key deserializers using as "just another" set of @@ -52,12 +54,17 @@ public class DeserializerFactoryConfig */ protected final ValueInstantiators[] _valueInstantiators; + /** + * TODO make this an array? + */ + protected final SubTypeValidator _subTypeValidator; + /** * Constructor for creating basic configuration with no additional * handlers. */ public DeserializerFactoryConfig() { - this(null, null, null, null); + this(null, null, null, null, null); } /** @@ -67,7 +74,8 @@ public DeserializerFactoryConfig() { protected DeserializerFactoryConfig(Deserializers[] allAdditionalDeserializers, KeyDeserializers[] allAdditionalKeyDeserializers, BeanDeserializerModifier[] modifiers, - ValueInstantiators[] vi) + ValueInstantiators[] vi, + SubTypeValidator subTypeValidator) { _additionalDeserializers = (allAdditionalDeserializers == null) ? NO_DESERIALIZERS : allAdditionalDeserializers; @@ -75,6 +83,7 @@ protected DeserializerFactoryConfig(Deserializers[] allAdditionalDeserializers, DEFAULT_KEY_DESERIALIZERS : allAdditionalKeyDeserializers; _modifiers = (modifiers == null) ? NO_MODIFIERS : modifiers; _valueInstantiators = (vi == null) ? NO_VALUE_INSTANTIATORS : vi; + _subTypeValidator = (subTypeValidator == null) ? DEFAULT_SUBTYPE_VALIDATOR : subTypeValidator; } /** @@ -90,7 +99,7 @@ public DeserializerFactoryConfig withAdditionalDeserializers(Deserializers addit } Deserializers[] all = ArrayBuilders.insertInListNoDup(_additionalDeserializers, additional); return new DeserializerFactoryConfig(all, _additionalKeyDeserializers, _modifiers, - _valueInstantiators); + _valueInstantiators, _subTypeValidator); } /** @@ -106,7 +115,7 @@ public DeserializerFactoryConfig withAdditionalKeyDeserializers(KeyDeserializers } KeyDeserializers[] all = ArrayBuilders.insertInListNoDup(_additionalKeyDeserializers, additional); return new DeserializerFactoryConfig(_additionalDeserializers, all, _modifiers, - _valueInstantiators); + _valueInstantiators, _subTypeValidator); } /** @@ -122,7 +131,7 @@ public DeserializerFactoryConfig withDeserializerModifier(BeanDeserializerModifi } BeanDeserializerModifier[] all = ArrayBuilders.insertInListNoDup(_modifiers, modifier); return new DeserializerFactoryConfig(_additionalDeserializers, _additionalKeyDeserializers, - all, _valueInstantiators); + all, _valueInstantiators, _subTypeValidator); } /** @@ -142,9 +151,18 @@ public DeserializerFactoryConfig withValueInstantiators(ValueInstantiators insta } ValueInstantiators[] all = ArrayBuilders.insertInListNoDup(_valueInstantiators, instantiators); return new DeserializerFactoryConfig(_additionalDeserializers, _additionalKeyDeserializers, - _modifiers, all); + _modifiers, all, _subTypeValidator); } - + + public DeserializerFactoryConfig withSubTypeValidator(SubTypeValidator subTypeValidator) + { + if (subTypeValidator == null) { + throw new IllegalArgumentException("Cannot pass null validator"); + } + return new DeserializerFactoryConfig(_additionalDeserializers, _additionalKeyDeserializers, + _modifiers, _valueInstantiators, subTypeValidator); + } + public boolean hasDeserializers() { return _additionalDeserializers.length > 0; } public boolean hasKeyDeserializers() { return _additionalKeyDeserializers.length > 0; } @@ -168,4 +186,8 @@ public Iterable deserializerModifiers() { public Iterable valueInstantiators() { return new ArrayIterator(_valueInstantiators); } + + public SubTypeValidator subTypeValidator() { + return _subTypeValidator; + } } diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java index bb0bee774f..38c1b3862c 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java @@ -915,6 +915,6 @@ protected void _validateSubType(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc) throws JsonMappingException { - SubTypeValidator.instance().validateSubType(ctxt, type, beanDesc); + this._factoryConfig.subTypeValidator().validateSubType(ctxt, type, beanDesc); } }