builder = mod.updateBuilder(config, beanDesc, builder); deserializer = mod.modifyDeserializer(config, beanDesc, deserializer);
BeanDescription beanDesc, List<BeanPropertyDefinition> propDefs) { List<BeanPropertyDefinition> definitions = super.updateProperties(config, beanDesc, propDefs); List<BeanPropertyDefinition> remove = new ArrayList<>(); List<BeanPropertyDefinition> add = new ArrayList<>();
@Override public JsonDeserializer<?> modifyCollectionDeserializer(final DeserializationConfig config, final CollectionType type, final BeanDescription beanDesc, final JsonDeserializer<?> deserializer) { if (deserializer instanceof CollectionDeserializer) { return new ListDeserializer((CollectionDeserializer) deserializer); } else { return super.modifyCollectionDeserializer(config, type, beanDesc, deserializer); } } });
@Override public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) { if (deserializer instanceof BeanDeserializer) { BeanDeserializer beanDeserializer = (BeanDeserializer) deserializer; return new EntityBeanDeserializer(beanDeserializer, deserializer.getObjectIdReader()); } return super.modifyDeserializer(config, beanDesc, deserializer); }
deser = mod.modifyArrayDeserializer(config, type, beanDesc, deser);
deser = mod.modifyMapDeserializer(config, type, beanDesc, deser);
deser = mod.modifyEnumDeserializer(config, type, beanDesc, deser);
@Override public BeanDeserializerBuilder updateBuilder(DeserializationConfig config, BeanDescription beanDesc, BeanDeserializerBuilder builder) { return super.updateBuilder(config, beanDesc, builder); } }
@Override public JsonDeserializer<?> createCollectionLikeDeserializer(DeserializationContext ctxt, CollectionLikeType type, final BeanDescription beanDesc) throws JsonMappingException { JavaType contentType = type.getContentType(); // Very first thing: is deserializer hard-coded for elements? JsonDeserializer<Object> contentDeser = contentType.getValueHandler(); final DeserializationConfig config = ctxt.getConfig(); // Then optional type info (1.5): if type has been resolved, we may already know type deserializer: TypeDeserializer contentTypeDeser = contentType.getTypeHandler(); // but if not, may still be possible to find: if (contentTypeDeser == null) { contentTypeDeser = findTypeDeserializer(config, contentType); } JsonDeserializer<?> deser = _findCustomCollectionLikeDeserializer(type, config, beanDesc, contentTypeDeser, contentDeser); if (deser != null) { // and then new with 2.2: ability to post-process it too (Issue#120) if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { deser = mod.modifyCollectionLikeDeserializer(config, type, beanDesc, deser); } } } return deser; }
/** * Method called by {@link BeanDeserializerFactory} to see if there might be a standard * deserializer registered for given type. */ protected JsonDeserializer<?> findStdDeserializer(DeserializationContext ctxt, JavaType type, BeanDescription beanDesc) throws JsonMappingException { // note: we do NOT check for custom deserializers here, caller has already // done that JsonDeserializer<?> deser = findDefaultDeserializer(ctxt, type, beanDesc); // Also: better ensure these are post-processable? if (deser != null) { if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { deser = mod.modifyDeserializer(ctxt.getConfig(), beanDesc, deser); } } } return deser; }
@Override public JsonDeserializer<?> modifyArrayDeserializer(DeserializationConfig config, ArrayType valueType, BeanDescription beanDesc, JsonDeserializer<?> deserializer) { return new ContextualLocationDeserializerWrapper(locations, super.modifyArrayDeserializer(config, valueType, beanDesc, deserializer)); }
@Override public JsonDeserializer<?> modifyMapDeserializer(DeserializationConfig config, MapType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) { return new ContextualLocationDeserializerWrapper(locations, super.modifyMapDeserializer(config, type, beanDesc, deserializer)); } });
@Override public JsonDeserializer<?> modifyEnumDeserializer(DeserializationConfig config, JavaType type, BeanDescription beanDesc, JsonDeserializer<?> deserializer) { if (Arrays.asList(Quality.class, Format.class).contains(type.getRawClass())) { return new EnumDeserializer((Class<? extends Enum>) type.getRawClass()); } return super.modifyEnumDeserializer(config, type, beanDesc, deserializer); }
@Override public BeanDeserializerBuilder updateBuilder( final DeserializationConfig config, final BeanDescription beanDesc, final BeanDeserializerBuilder builder) { if (ThreadLocalBuilder.class.isAssignableFrom(beanDesc.getBeanClass())) { @SuppressWarnings("unchecked") final Class<ThreadLocalBuilder<?>> threadLocalBuilderClass = (Class<ThreadLocalBuilder<?>>) beanDesc.getBeanClass(); return new ThreadLocalBuilderBeanDeserializerBuilder(threadLocalBuilderClass, builder); } return super.updateBuilder(config, beanDesc, builder); } }
@Override public JsonDeserializer<?> createCollectionLikeDeserializer(DeserializationContext ctxt, CollectionLikeType type, final BeanDescription beanDesc) throws JsonMappingException { JavaType contentType = type.getContentType(); // Very first thing: is deserializer hard-coded for elements? JsonDeserializer<Object> contentDeser = contentType.getValueHandler(); final DeserializationConfig config = ctxt.getConfig(); // Then optional type info (1.5): if type has been resolved, we may already know type deserializer: TypeDeserializer contentTypeDeser = contentType.getTypeHandler(); // but if not, may still be possible to find: if (contentTypeDeser == null) { contentTypeDeser = findTypeDeserializer(config, contentType); } JsonDeserializer<?> deser = _findCustomCollectionLikeDeserializer(type, config, beanDesc, contentTypeDeser, contentDeser); if (deser != null) { // and then new with 2.2: ability to post-process it too (Issue#120) if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { deser = mod.modifyCollectionLikeDeserializer(config, type, beanDesc, deser); } } } return deser; }
if (_factoryConfig.hasDeserializerModifiers()) { for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { builder = mod.updateBuilder(config, beanDesc, builder); deserializer = mod.modifyDeserializer(config, beanDesc, deserializer);
@Override public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) { // Jackson wants to use its default bean deserializer for subtypes of Enumerable. // We must prevent that; return the deserializer for Enumerables instead. return isEnumerableSubtype(beanDesc) ? EnumerableModule.this.deserializer : super.modifyDeserializer(config, beanDesc, deserializer); } });
propDefs = mod.updateProperties(ctxt.getConfig(), beanDesc, propDefs);
deser = mod.modifyCollectionDeserializer(config, type, beanDesc, deser);
@Override public JsonDeserializer<?> modifyArrayDeserializer(DeserializationConfig config, ArrayType valueType, BeanDescription beanDesc, JsonDeserializer<?> deserializer) { return new ContextualLocationDeserializerWrapper(locations, super.modifyArrayDeserializer(config, valueType, beanDesc, deserializer)); }