diff options
Diffstat (limited to 'src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java')
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java | 125 |
1 files changed, 105 insertions, 20 deletions
diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java index 2f4151271..280857cb3 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdValueInstantiator.java @@ -8,6 +8,8 @@ import com.fasterxml.jackson.databind.annotation.JacksonStdImpl; import com.fasterxml.jackson.databind.deser.*; import com.fasterxml.jackson.databind.introspect.AnnotatedWithParams; import com.fasterxml.jackson.databind.util.ClassUtil; +import java.math.BigDecimal; +import java.math.BigInteger; /** * Default {@link ValueInstantiator} implementation, which supports @@ -46,7 +48,7 @@ public class StdValueInstantiator protected SettableBeanProperty[] _constructorArguments; // // // Delegate construction - + protected JavaType _delegateType; protected AnnotatedWithParams _delegateCreator; protected SettableBeanProperty[] _delegateArguments; @@ -56,13 +58,15 @@ public class StdValueInstantiator protected JavaType _arrayDelegateType; protected AnnotatedWithParams _arrayDelegateCreator; protected SettableBeanProperty[] _arrayDelegateArguments; - + // // // Scalar construction protected AnnotatedWithParams _fromStringCreator; protected AnnotatedWithParams _fromIntCreator; protected AnnotatedWithParams _fromLongCreator; + protected AnnotatedWithParams _fromBigIntegerCreator; protected AnnotatedWithParams _fromDoubleCreator; + protected AnnotatedWithParams _fromBigDecimalCreator; protected AnnotatedWithParams _fromBooleanCreator; /* @@ -106,11 +110,13 @@ public class StdValueInstantiator _arrayDelegateType = src._arrayDelegateType; _arrayDelegateCreator = src._arrayDelegateCreator; _arrayDelegateArguments = src._arrayDelegateArguments; - + _fromStringCreator = src._fromStringCreator; _fromIntCreator = src._fromIntCreator; _fromLongCreator = src._fromLongCreator; + _fromBigIntegerCreator = src._fromBigIntegerCreator; _fromDoubleCreator = src._fromDoubleCreator; + _fromBigDecimalCreator = src._fromBigDecimalCreator; _fromBooleanCreator = src._fromBooleanCreator; } @@ -153,10 +159,14 @@ public class StdValueInstantiator _fromLongCreator = creator; } + public void configureFromBigIntegerCreator(AnnotatedWithParams creator) { _fromBigIntegerCreator = creator; } + public void configureFromDoubleCreator(AnnotatedWithParams creator) { _fromDoubleCreator = creator; } + public void configureFromBigDecimalCreator(AnnotatedWithParams creator) { _fromBigDecimalCreator = creator; } + public void configureFromBooleanCreator(AnnotatedWithParams creator) { _fromBooleanCreator = creator; } @@ -193,11 +203,17 @@ public class StdValueInstantiator } @Override + public boolean canCreateFromBigInteger() { return _fromBigIntegerCreator != null; } + + @Override public boolean canCreateFromDouble() { return (_fromDoubleCreator != null); } @Override + public boolean canCreateFromBigDecimal() { return _fromBigDecimalCreator != null; } + + @Override public boolean canCreateFromBoolean() { return (_fromBooleanCreator != null); } @@ -245,7 +261,7 @@ public class StdValueInstantiator public SettableBeanProperty[] getFromObjectArguments(DeserializationConfig config) { return _constructorArguments; } - + /* /********************************************************** /* Public API implementation; instantiation from JSON Object @@ -345,37 +361,106 @@ public class StdValueInstantiator arg, rewrapCtorProblem(ctxt, t0)); } } + + if (_fromBigIntegerCreator != null) { + Object arg = BigInteger.valueOf(value); + try { + return _fromBigIntegerCreator.call1(arg); + } catch (Throwable t0) { + return ctxt.handleInstantiationProblem(_fromBigIntegerCreator.getDeclaringClass(), + arg, rewrapCtorProblem(ctxt, t0) + ); + } + } + return super.createFromInt(ctxt, value); } @Override public Object createFromLong(DeserializationContext ctxt, long value) throws IOException { - if (_fromLongCreator == null) { - return super.createFromLong(ctxt, value); + if (_fromLongCreator != null) { + Object arg = Long.valueOf(value); + try { + return _fromLongCreator.call1(arg); + } catch (Throwable t0) { + return ctxt.handleInstantiationProblem(_fromLongCreator.getDeclaringClass(), + arg, + rewrapCtorProblem(ctxt, t0) + ); + } } - Object arg = Long.valueOf(value); - try { - return _fromLongCreator.call1(arg); - } catch (Throwable t0) { - return ctxt.handleInstantiationProblem(_fromLongCreator.getDeclaringClass(), - arg, rewrapCtorProblem(ctxt, t0)); + + if (_fromBigIntegerCreator != null) { + Object arg = BigInteger.valueOf(value); + try { + return _fromBigIntegerCreator.call1(arg); + } catch (Throwable t0) { + return ctxt.handleInstantiationProblem(_fromBigIntegerCreator.getDeclaringClass(), + arg, rewrapCtorProblem(ctxt, t0) + ); + } } + + return super.createFromLong(ctxt, value); + } + + @Override + public Object createFromBigInteger(DeserializationContext ctxt, BigInteger value) throws IOException + { + if (_fromBigDecimalCreator != null) { + try { + return _fromBigIntegerCreator.call1(value); + } catch (Throwable t) { + return ctxt.handleInstantiationProblem(_fromBigIntegerCreator.getDeclaringClass(), + value, rewrapCtorProblem(ctxt, t) + ); + } + } + + return super.createFromBigInteger(ctxt, value); } @Override public Object createFromDouble(DeserializationContext ctxt, double value) throws IOException { - if (_fromDoubleCreator == null) { - return super.createFromDouble(ctxt, value); + if(_fromDoubleCreator != null) { + Object arg = Double.valueOf(value); + try { + return _fromDoubleCreator.call1(arg); + } catch (Throwable t0) { + return ctxt.handleInstantiationProblem(_fromDoubleCreator.getDeclaringClass(), + arg, rewrapCtorProblem(ctxt, t0)); + } } - Object arg = Double.valueOf(value); - try { - return _fromDoubleCreator.call1(arg); - } catch (Throwable t0) { - return ctxt.handleInstantiationProblem(_fromDoubleCreator.getDeclaringClass(), - arg, rewrapCtorProblem(ctxt, t0)); + + if (_fromBigDecimalCreator != null) { + Object arg = BigDecimal.valueOf(value); + try { + return _fromBigDecimalCreator.call1(arg); + } catch (Throwable t0) { + return ctxt.handleInstantiationProblem(_fromBigDecimalCreator.getDeclaringClass(), + arg, rewrapCtorProblem(ctxt, t0)); + } } + + return super.createFromDouble(ctxt, value); + } + + @Override + public Object createFromBigDecimal(DeserializationContext ctxt, BigDecimal value) throws IOException + { + if (_fromBigDecimalCreator != null) { + try { + return _fromBigDecimalCreator.call1(value); + } catch (Throwable t) { + return ctxt.handleInstantiationProblem(_fromBigDecimalCreator.getDeclaringClass(), + value, rewrapCtorProblem(ctxt, t) + ); + } + } + + return super.createFromBigDecimal(ctxt, value); } @Override |