Java tutorial
package com.fasterxml.jackson.databind.deser.std; import java.io.IOException; import java.util.Collection; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.deser.*; import com.fasterxml.jackson.databind.deser.impl.ObjectIdReader; import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; /** * Base class that simplifies implementations of {@link JsonDeserializer}s * that mostly delegate functionality to another deserializer implementation * (possibly forming a chaing of deserializers delegating functionality * in some cases) * * @since 2.1 */ public abstract class DelegatingDeserializer extends StdDeserializer<Object> implements ContextualDeserializer, ResolvableDeserializer { private static final long serialVersionUID = 1L; protected final JsonDeserializer<?> _delegatee; /* /********************************************************************** /* Construction /********************************************************************** */ public DelegatingDeserializer(JsonDeserializer<?> delegatee) { super(_figureType(delegatee)); _delegatee = delegatee; } protected abstract JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegatee); private static Class<?> _figureType(JsonDeserializer<?> deser) { Class<?> cls = deser.handledType(); if (cls != null) { return cls; } return Object.class; } /* /********************************************************************** /* Overridden methods for contextualization, resolving /********************************************************************** */ @Override public void resolve(DeserializationContext ctxt) throws JsonMappingException { if (_delegatee instanceof ResolvableDeserializer) { ((ResolvableDeserializer) _delegatee).resolve(ctxt); } } @Override public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException { JsonDeserializer<?> del = ctxt.handleSecondaryContextualization(_delegatee, property); if (del == _delegatee) { return this; } return newDelegatingInstance(del); } /** * @deprecated Since 2.3, use {@link #newDelegatingInstance} instead */ @Deprecated protected JsonDeserializer<?> _createContextual(DeserializationContext ctxt, BeanProperty property, JsonDeserializer<?> newDelegatee) { if (newDelegatee == _delegatee) { return this; } return newDelegatingInstance(newDelegatee); } @Override public SettableBeanProperty findBackReference(String logicalName) { // [Issue#253]: Hope this works.... return _delegatee.findBackReference(logicalName); } /* /********************************************************************** /* Overridden deserialization methods /********************************************************************** */ @Override public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { return _delegatee.deserialize(jp, ctxt); } @SuppressWarnings("unchecked") @Override public Object deserialize(JsonParser jp, DeserializationContext ctxt, Object intoValue) throws IOException, JsonProcessingException { return ((JsonDeserializer<Object>) _delegatee).deserialize(jp, ctxt, intoValue); } @Override public Object deserializeWithType(JsonParser jp, DeserializationContext ctxt, TypeDeserializer typeDeserializer) throws IOException, JsonProcessingException { return _delegatee.deserializeWithType(jp, ctxt, typeDeserializer); } /* /********************************************************************** /* Overridden other methods /********************************************************************** */ @Override public JsonDeserializer<?> replaceDelegatee(JsonDeserializer<?> delegatee) { if (delegatee == _delegatee) { return this; } return newDelegatingInstance(delegatee); } @Override public Object getNullValue() { return _delegatee.getNullValue(); } @Override public Object getEmptyValue() { return _delegatee.getEmptyValue(); } @Override public Collection<Object> getKnownPropertyNames() { return _delegatee.getKnownPropertyNames(); } @Override public boolean isCachable() { return _delegatee.isCachable(); } @Override public ObjectIdReader getObjectIdReader() { return _delegatee.getObjectIdReader(); } @Override public JsonDeserializer<?> getDelegatee() { return _delegatee; } }