diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java | 14 | ||||
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java | 15 | ||||
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/util/BeanUtil.java | 46 | ||||
-rw-r--r-- | src/main/java/com/fasterxml/jackson/databind/util/ClassUtil.java | 7 | ||||
-rw-r--r-- | src/test/java/com/fasterxml/jackson/databind/interop/DateJava8FallbacksTest.java (renamed from src/test/java/com/fasterxml/jackson/databind/deser/jdk/DateJava8FallbacksTest.java) | 10 |
5 files changed, 64 insertions, 28 deletions
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 91e6ebc26..fcf93b1fa 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; import com.fasterxml.jackson.databind.introspect.*; import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; import com.fasterxml.jackson.databind.jsontype.impl.SubTypeValidator; +import com.fasterxml.jackson.databind.util.BeanUtil; import com.fasterxml.jackson.databind.util.ClassUtil; import com.fasterxml.jackson.databind.util.SimpleBeanPropertyDefinition; @@ -200,14 +201,11 @@ public class BeanDeserializerFactory JavaType type, BeanDescription beanDesc) throws JsonMappingException { - if (ClassUtil.isJava8TimeClass(type.getRawClass())) { - // 05-May-2020, tatu: Should we check for possible Shape override to "POJO"? - // (to let users force 'serialize-as-POJO'? - return new UnsupportedTypeDeserializer(type, -"Java 8 date/time type "+ClassUtil.getTypeDescription(type) -+" not supported by default: please register module `jackson-datatype-jsr310` to add handling"); - } - return null; + // 05-May-2020, tatu: Should we check for possible Shape override to "POJO"? + // (to let users force 'serialize-as-POJO'? Or not? + final String errorMsg = BeanUtil.checkUnsupportedType(type); + return (errorMsg == null) ? null + : new UnsupportedTypeDeserializer(type, errorMsg); } protected JavaType materializeAbstractType(DeserializationContext ctxt, diff --git a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java index 043485cc8..e71f4fd70 100644 --- a/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer; import com.fasterxml.jackson.databind.ser.std.MapSerializer; import com.fasterxml.jackson.databind.ser.std.StdDelegatingSerializer; import com.fasterxml.jackson.databind.type.ReferenceType; +import com.fasterxml.jackson.databind.util.BeanUtil; import com.fasterxml.jackson.databind.util.ClassUtil; import com.fasterxml.jackson.databind.util.Converter; @@ -825,14 +826,10 @@ public class BeanSerializerFactory JavaType type, BeanDescription beanDesc) throws JsonMappingException { - if (ClassUtil.isJava8TimeClass(type.getRawClass())) { - // 05-May-2020, tatu: Should we check for possible Shape override to "POJO"? - // (to let users force 'serialize-as-POJO'? - return new UnsupportedTypeSerializer(type, -"Java 8 date/time type "+ClassUtil.getTypeDescription(type) -+" not supported by default: please register module `jackson-datatype-jsr310` to add handling"); - } - return null; - + // 05-May-2020, tatu: Should we check for possible Shape override to "POJO"? + // (to let users force 'serialize-as-POJO'? + final String errorMsg = BeanUtil.checkUnsupportedType(type); + return (errorMsg == null) ? null + : new UnsupportedTypeSerializer(type, errorMsg); } } diff --git a/src/main/java/com/fasterxml/jackson/databind/util/BeanUtil.java b/src/main/java/com/fasterxml/jackson/databind/util/BeanUtil.java index d381cdbf0..c58930bf6 100644 --- a/src/main/java/com/fasterxml/jackson/databind/util/BeanUtil.java +++ b/src/main/java/com/fasterxml/jackson/databind/util/BeanUtil.java @@ -289,4 +289,50 @@ public class BeanUtil sb.append(basename, offset+1, end); return sb.toString(); } + + /* + /********************************************************** + /* Package-specific type detection for error handling + /********************************************************** + */ + + /** + * Helper method called by {@link com.fasterxml.jackson.databind.deser.BeanDeserializerFactory} + * and {@link com.fasterxml.jackson.databind.ser.BeanSerializerFactory} to check + * if given unrecognized type (to be (de)serialized as general POJO) is one of + * "well-known" types for which there would be a datatype module; and if so, + * return appropriate failure message to give to caller. + * + * @since 2.12 + */ + public static String checkUnsupportedType(JavaType type) { + final Class<?> rawType = type.getRawClass(); + String typeName, moduleName; + + if (isJava8TimeClass(rawType)) { + typeName = "Java 8 date/time"; + moduleName = "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"; + } else if (isJodaTimeClass(rawType)) { + typeName = "Joda date/time"; + moduleName = "com.fasterxml.jackson.datatype:jackson-datatype-joda"; + } else { + return null; + } + return String.format("%s type %s not supported by default: add Module \"%s\" to enable handling", + typeName, ClassUtil.getTypeDescription(type), moduleName); + } + + /** + * @since 2.12 + */ + public static boolean isJava8TimeClass(Class<?> rawType) { + return rawType.getName().startsWith("java.time."); + } + + /** + * @since 2.12 + */ + public static boolean isJodaTimeClass(Class<?> rawType) { + return rawType.getName().startsWith("org.joda.time."); + } } diff --git a/src/main/java/com/fasterxml/jackson/databind/util/ClassUtil.java b/src/main/java/com/fasterxml/jackson/databind/util/ClassUtil.java index a80b72a2a..78f5562e9 100644 --- a/src/main/java/com/fasterxml/jackson/databind/util/ClassUtil.java +++ b/src/main/java/com/fasterxml/jackson/databind/util/ClassUtil.java @@ -1088,13 +1088,6 @@ public final class ClassUtil return rawType.getName().startsWith("java."); } - /** - * @since 2.12 - */ - public static boolean isJava8TimeClass(Class<?> rawType) { - return rawType.getName().startsWith("java.time."); - } - /* /********************************************************** /* Access to various Class definition aspects; possibly diff --git a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DateJava8FallbacksTest.java b/src/test/java/com/fasterxml/jackson/databind/interop/DateJava8FallbacksTest.java index 41d9fa4f0..37fd4e79c 100644 --- a/src/test/java/com/fasterxml/jackson/databind/deser/jdk/DateJava8FallbacksTest.java +++ b/src/test/java/com/fasterxml/jackson/databind/interop/DateJava8FallbacksTest.java @@ -1,4 +1,4 @@ -package com.fasterxml.jackson.databind.deser.jdk; +package com.fasterxml.jackson.databind.interop; import java.time.Instant; import java.time.OffsetDateTime; @@ -8,8 +8,10 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; // [databind#2683]: add fallback handling for Java 8 date/time types, to -// prevent accidental serialzization as POJOs, as well as give more information +// prevent accidental serialization as POJOs, as well as give more information // on deserialization attempts +// +// @since 2.12 public class DateJava8FallbacksTest extends BaseMapTest { private final ObjectMapper MAPPER = newJsonMapper(); @@ -26,7 +28,7 @@ public class DateJava8FallbacksTest extends BaseMapTest fail("Should not pass, wrote out as\n: "+json); } catch (InvalidDefinitionException e) { verifyException(e, "Java 8 date/time type `java.time.OffsetDateTime` not supported by default"); - verifyException(e, "please register module `jackson-datatype-jsr310`"); + verifyException(e, "add Module \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\""); } } @@ -37,7 +39,7 @@ public class DateJava8FallbacksTest extends BaseMapTest fail("Not expecting to pass, resulted in: "+result); } catch (InvalidDefinitionException e) { verifyException(e, "Java 8 date/time type `java.time.OffsetDateTime` not supported by default"); - verifyException(e, "please register module `jackson-datatype-jsr310`"); + verifyException(e, "add Module \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\""); } } } |