diff options
author | Tatu Saloranta <tatu.saloranta@iki.fi> | 2019-09-15 16:17:48 -0700 |
---|---|---|
committer | Tatu Saloranta <tatu.saloranta@iki.fi> | 2019-09-15 16:17:48 -0700 |
commit | 2599caf11064b38960e75f534ce8bdf6d43b90c5 (patch) | |
tree | 9af62d921e9a06add285ea7be25bee611f5f797d | |
parent | 28e775fcac16452cc011903cd9cca7661c5e9a6f (diff) | |
download | jackson-databind-2599caf11064b38960e75f534ce8bdf6d43b90c5.tar.gz |
Update release notes wrt #2133, minor code cleanup
10 files changed, 46 insertions, 85 deletions
diff --git a/release-notes/CREDITS-2.x b/release-notes/CREDITS-2.x index e97ec2705..f83031cab 100644 --- a/release-notes/CREDITS-2.x +++ b/release-notes/CREDITS-2.x @@ -837,6 +837,9 @@ Christopher Smith (chrylis@github) Semyon Levin (remal@github) * Contributed #2120: `NioPathDeserializer` improvement (2.9.7) + * Contributed #2133: Improve `DeserializationProblemHandler.handleUnexpectedToken()` + to allow handling of Collection problems + (2.10.0) Pavel Nikitin (morj@github) * Requested #2181: Don't re-use dynamic serializers for property-updating copy constructors diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index 60e7cc86e..0a55cc46a 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -8,6 +8,9 @@ Project: jackson-databind #2129: Add `SerializationFeature.WRITE_ENUM_KEYS_USING_INDEX`, separate from value setting (suggested by renzihui@github) +#2133: Improve `DeserializationProblemHandler.handleUnexpectedToken()` to allow handling of + Collection problems + (contributed by Semyon L) #2149: Add `MapperFeature.ACCEPT_CASE_INSENSITIVE_VALUES` (suggested by Craig P) #2164: `FactoryBasedEnumDeserializer` does not respect diff --git a/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java b/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java index 36cf0a4ff..ea6548531 100644 --- a/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java +++ b/src/main/java/com/fasterxml/jackson/databind/DeserializationContext.java @@ -1111,7 +1111,7 @@ targetType, goodValue.getClass())); public Object handleUnexpectedToken(Class<?> instClass, JsonParser p) throws IOException { - return handleUnexpectedToken(instClass, p.getCurrentToken(), p, null); + return handleUnexpectedToken(constructType(instClass), p.getCurrentToken(), p, null); } /** diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java index 8db39def9..dc8776b1c 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java @@ -195,12 +195,7 @@ public class BeanDeserializer default: } } - JavaType valueType = getValueType(); - if (valueType != null) { - return ctxt.handleUnexpectedToken(valueType, p); - } else { - return ctxt.handleUnexpectedToken(handledType(), p); - } + return ctxt.handleUnexpectedToken(getValueType(ctxt), p); } @Deprecated // since 2.8; remove unless getting used @@ -564,12 +559,7 @@ public class BeanDeserializer p2.close(); return ob; } - JavaType valueType = getValueType(); - if (valueType != null) { - return ctxt.handleUnexpectedToken(valueType, p); - } else { - return ctxt.handleUnexpectedToken(handledType(), p); - } + return ctxt.handleUnexpectedToken(getValueType(ctxt), p); } /* 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 bcfb9c959..82cacd1fb 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerBase.java @@ -1455,19 +1455,9 @@ public abstract class BeanDeserializerBase if (t == JsonToken.END_ARRAY) { return null; } - JavaType valueType = getValueType(); - if (valueType != null) { - return ctxt.handleUnexpectedToken(valueType, JsonToken.START_ARRAY, p, null); - } else { - return ctxt.handleUnexpectedToken(handledType(), JsonToken.START_ARRAY, p, null); - } - } - JavaType valueType = getValueType(); - if (valueType != null) { - return ctxt.handleUnexpectedToken(valueType, p); - } else { - return ctxt.handleUnexpectedToken(handledType(), p); + return ctxt.handleUnexpectedToken(getValueType(ctxt), JsonToken.START_ARRAY, p, null); } + return ctxt.handleUnexpectedToken(getValueType(ctxt), p); } public Object deserializeFromEmbedded(JsonParser p, DeserializationContext ctxt) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java index 0952b365b..a92cbb66d 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BuilderBasedDeserializer.java @@ -216,12 +216,7 @@ public class BuilderBasedDeserializer return finishBuild(ctxt, deserializeFromObject(p, ctxt)); default: } - JavaType valueType = getValueType(); - if (valueType != null) { - return ctxt.handleUnexpectedToken(valueType, p); - } else { - return ctxt.handleUnexpectedToken(handledType(), p); - } + return ctxt.handleUnexpectedToken(getValueType(ctxt), p); } /** diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/DeserializationProblemHandler.java b/src/main/java/com/fasterxml/jackson/databind/deser/DeserializationProblemHandler.java index 2524f18b9..2d6b88c21 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/DeserializationProblemHandler.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/DeserializationProblemHandler.java @@ -202,32 +202,14 @@ public abstract class DeserializationProblemHandler } /** - * Method that deserializers should call if the first token of the value to - * deserialize is of unexpected type (that is, type of token that deserializer - * cannot handle). This could occur, for example, if a Number deserializer - * encounter {@link JsonToken#START_ARRAY} instead of - * {@link JsonToken#VALUE_NUMBER_INT} or {@link JsonToken#VALUE_NUMBER_FLOAT}. - *<ul> - * <li>Indicate it does not know what to do by returning {@link #NOT_HANDLED} - * </li> - * <li>Throw a {@link IOException} to indicate specific fail message (instead of - * standard exception caller would throw - * </li> - * <li>Handle content to match (by consuming or skipping it), and return actual - * instantiated value (of type <code>targetType</code>) to use as replacement; - * value may be `null` as well as expected target type. - * </li> - * </ul> - * - * @param failureMsg Message that will be used by caller - * to indicate type of failure unless handler produces value to use - * - * @return Either {@link #NOT_HANDLED} to indicate that handler does not know - * what to do (and exception may be thrown), or value to use (possibly - * <code>null</code> + * Deprecated variant of + * {@link #handleUnexpectedToken(DeserializationContext, JavaType, JsonToken, JsonParser, String) * * @since 2.8 + * + * @deprecated Since 2.10 */ + @SuppressWarnings("javadoc") @Deprecated public Object handleUnexpectedToken(DeserializationContext ctxt, Class<?> targetType, JsonToken t, JsonParser p, @@ -269,7 +251,7 @@ public abstract class DeserializationProblemHandler String failureMsg) throws IOException { - // Calling class-version handler for backward compatibility + // Calling class-version handler for backward compatibility, as of 2.10 return handleUnexpectedToken(ctxt, targetType.getRawClass(), t, p, failureMsg); } diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/impl/BeanAsArrayBuilderDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/impl/BeanAsArrayBuilderDeserializer.java index 99924f4f9..6d3a507f7 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/impl/BeanAsArrayBuilderDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/impl/BeanAsArrayBuilderDeserializer.java @@ -344,12 +344,7 @@ public class BeanAsArrayBuilderDeserializer // Let's start with failure String message = "Cannot deserialize a POJO (of type %s) from non-Array representation (token: %s): " + "type/property designed to be serialized as JSON Array"; - JavaType valueType = getValueType(); - if (valueType != null) { - return ctxt.handleUnexpectedToken(valueType, p.getCurrentToken(), p, message, _beanType.getRawClass().getName(), p.getCurrentToken()); - } else { - return ctxt.handleUnexpectedToken(handledType(), p.getCurrentToken(), p, message, _beanType.getRawClass().getName(), p.getCurrentToken()); - } + return ctxt.handleUnexpectedToken(getValueType(ctxt), p.getCurrentToken(), p, message, _beanType.getRawClass().getName(), p.getCurrentToken()); // in future, may allow use of "standard" POJO serialization as well; if so, do: //return _delegate.deserialize(p, ctxt); } diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/impl/BeanAsArrayDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/impl/BeanAsArrayDeserializer.java index 8152ca870..832afd0cc 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/impl/BeanAsArrayDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/impl/BeanAsArrayDeserializer.java @@ -364,12 +364,7 @@ public class BeanAsArrayDeserializer { String message = "Cannot deserialize a POJO (of type %s) from non-Array representation (token: %s): " +"type/property designed to be serialized as JSON Array"; - JavaType valueType = getValueType(); - if (valueType != null) { - return ctxt.handleUnexpectedToken(valueType, p.getCurrentToken(), p, message, _beanType.getRawClass().getName(), p.getCurrentToken()); - } else { - return ctxt.handleUnexpectedToken(handledType(), p.getCurrentToken(), p, message, _beanType.getRawClass().getName(), p.getCurrentToken()); - } + return ctxt.handleUnexpectedToken(getValueType(ctxt), p.getCurrentToken(), p, message, _beanType.getRawClass().getName(), p.getCurrentToken()); // in future, may allow use of "standard" POJO serialization as well; if so, do: //return _delegate.deserialize(p, ctxt); } diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java index 83e3692f7..dd2a549c9 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/std/StdDeserializer.java @@ -110,6 +110,26 @@ public abstract class StdDeserializer<T> public JavaType getValueType() { return _valueType; } /** + * Convenience method for getting handled type as {@link JavaType}, regardless + * of whether deserializer has one already resolved (and accessible via + * {@link #getValueType()}) or not: equivalent to: + *<pre> + * if (getValueType() != null) { + * return getValueType(); + * } + * return ctxt.constructType(handledType()); + *</pre> + * + * @since 2.10 + */ + public JavaType getValueType(DeserializationContext ctxt) { + if (_valueType != null) { + return _valueType; + } + return ctxt.constructType(_valueClass); + } + + /** * Method that can be called to determine if given deserializer is the default * deserializer Jackson uses; as opposed to a custom deserializer installed by * a module or calling application. Determination is done using @@ -677,15 +697,9 @@ public abstract class StdDeserializer<T> } else { t = p.getCurrentToken(); } - if (_valueType != null) { - @SuppressWarnings("unchecked") - T result = (T) ctxt.handleUnexpectedToken(_valueType, t, p, null); - return result; - } else { - @SuppressWarnings("unchecked") - T result = (T) ctxt.handleUnexpectedToken(_valueClass, t, p, null); - return result; - } + @SuppressWarnings("unchecked") + T result = (T) ctxt.handleUnexpectedToken(getValueType(ctxt), p.getCurrentToken(), p, null); + return result; } /** @@ -705,15 +719,9 @@ public abstract class StdDeserializer<T> "Cannot deserialize instance of %s out of %s token: nested Arrays not allowed with %s", ClassUtil.nameOf(_valueClass), JsonToken.START_ARRAY, "DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS"); - if (_valueType != null) { - @SuppressWarnings("unchecked") - T result = (T) ctxt.handleUnexpectedToken(_valueType, p.getCurrentToken(), p, msg); - return result; - } else { - @SuppressWarnings("unchecked") - T result = (T) ctxt.handleUnexpectedToken(_valueClass, p.getCurrentToken(), p, msg); - return result; - } + @SuppressWarnings("unchecked") + T result = (T) ctxt.handleUnexpectedToken(getValueType(ctxt), p.getCurrentToken(), p, msg); + return result; } return (T) deserialize(p, ctxt); } |