aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2020-07-05 16:44:54 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2020-07-05 16:44:54 -0700
commit85c9c8544f0c4f01e88241acc1573746df4f755d (patch)
treec5edae86269d03f52471e6d94607a9be72dab168 /src
parent916de88600f87af281079aaea595930e588f6d06 (diff)
downloadjackson-databind-85c9c8544f0c4f01e88241acc1573746df4f755d.tar.gz
Fixed #2776
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java14
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/ser/BeanSerializerFactory.java15
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/util/BeanUtil.java46
-rw-r--r--src/main/java/com/fasterxml/jackson/databind/util/ClassUtil.java7
-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\"");
}
}
}