Skip to content

Commit 0cb7362

Browse files
committed
Work on #2539 (for master first)
1 parent 3e998c7 commit 0cb7362

File tree

6 files changed

+81
-26
lines changed

6 files changed

+81
-26
lines changed

src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java

+41-2
Original file line numberDiff line numberDiff line change
@@ -1568,7 +1568,7 @@ protected JsonDeserializer<?> findOptionalStdDeserializer(DeserializationContext
15681568
{
15691569
return OptionalHandlerFactory.instance.findDeserializer(ctxt.getConfig(), type);
15701570
}
1571-
1571+
15721572
/*
15731573
/**********************************************************************
15741574
/* DeserializerFactory impl (partial): key deserializers
@@ -1728,7 +1728,7 @@ public JsonDeserializer<?> findDefaultDeserializer(DeserializationContext ctxt,
17281728
String clsName = rawType.getName();
17291729
if (rawType.isPrimitive() || clsName.startsWith("java.")) {
17301730
// Primitives/wrappers, other Numbers:
1731-
JsonDeserializer<?> deser = NumberDeserializers.find(rawType, clsName);
1731+
JsonDeserializer<?> deser = NumberDeserializers.find(rawType);
17321732
if (deser == null) {
17331733
deser = DateDeserializers.find(rawType, clsName);
17341734
}
@@ -1747,6 +1747,45 @@ public JsonDeserializer<?> findDefaultDeserializer(DeserializationContext ctxt,
17471747
return StdJdkDeserializers.find(rawType, clsName);
17481748
}
17491749

1750+
/**
1751+
* Method that can be used to check if databind module has deserializer
1752+
* for given (likely JDK) type: explicit meaning that it is not automatically
1753+
* generated for POJO.
1754+
*<p>
1755+
* This matches {@link Deserializers#hasDeserializerFor(Class)} method.
1756+
*
1757+
* @since 3.0
1758+
*/
1759+
protected boolean hasExplicitDeserializerFor(Class<?> valueType) {
1760+
// Yes, we handle all Enum types
1761+
if (Enum.class.isAssignableFrom(valueType)) {
1762+
return true;
1763+
}
1764+
// Numbers?
1765+
final String clsName = valueType.getName();
1766+
if (clsName.startsWith("java.")) {
1767+
if (Number.class.isAssignableFrom(valueType)) {
1768+
return NumberDeserializers.find(valueType) != null;
1769+
}
1770+
if ((valueType == CLASS_STRING)
1771+
|| (valueType == Boolean.class)
1772+
|| (valueType == EnumMap.class)
1773+
|| (valueType == AtomicReference.class)
1774+
) {
1775+
return true;
1776+
}
1777+
if (DateDeserializers.hasDeserializerFor(valueType)) {
1778+
return true;
1779+
}
1780+
} else if (clsName.startsWith("com.fasterxml.")) {
1781+
return JsonNode.class.isAssignableFrom(valueType)
1782+
|| (valueType == TokenBuffer.class);
1783+
} else {
1784+
return OptionalHandlerFactory.instance.hasDeserializerFor(valueType);
1785+
}
1786+
return false;
1787+
}
1788+
17501789
private JavaType _findRemappedType(DeserializationConfig config, Class<?> rawType)
17511790
throws JsonMappingException
17521791
{

src/main/java/com/fasterxml/jackson/databind/deser/Deserializers.java

+17-20
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,21 @@ public JsonDeserializer<?> findMapLikeDeserializer(MapLikeType type,
234234
TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer)
235235
throws JsonMappingException;
236236

237-
// To be added in 3.0
238-
// public boolean hasDeserializerFor(Class<?> valueType);
237+
/**
238+
* Method that may be called to check whether this deserializer provider would provide
239+
* deserializer for values of given type, without attempting to construct (and possibly
240+
* fail in some cases) actual deserializer. Mostly needed to support validation
241+
* of polymorphic type ids.
242+
*<p>
243+
* Note: implementations should take care NOT to claim supporting types that they do
244+
* not recognize as this could to incorrect assumption of safe support by caller.
245+
*<p>
246+
* Method added in this implementation since adding new methods for interfaces
247+
* before Java 8 is not a good idea: will be added in Jackson 3.0 for `Deserializers`.
248+
*
249+
* @since 3.0
250+
*/
251+
public boolean hasDeserializerFor(Class<?> valueType);
239252

240253
/*
241254
/**********************************************************
@@ -333,23 +346,7 @@ public JsonDeserializer<?> findMapLikeDeserializer(MapLikeType type,
333346
return null;
334347
}
335348

336-
/**
337-
* Method that may be called to check whether this deserializer provider would provide
338-
* deserializer for values of given type, without attempting to construct (and possibly
339-
* fail in some cases) actual deserializer. Mostly needed to support validation
340-
* of polymorphic type ids.
341-
*<p>
342-
* Note: implementations should take care NOT to claim supporting types that they do
343-
* not recognize as this could to incorrect assumption of safe support by caller.
344-
*<p>
345-
* Method added in this implementation since adding new methods for interfaces
346-
* before Java 8 is not a good idea: will be added in Jackson 3.0 for `Deserializers`.
347-
*
348-
* @since 2.11
349-
*/
350-
public boolean hasDeserializerFor(Class<?> valueType) {
351-
return false;
352-
}
353-
// public abstract boolean hasDeserializerFor(Class<?> valueType);
349+
@Override
350+
public abstract boolean hasDeserializerFor(Class<?> valueType);
354351
}
355352
}

src/main/java/com/fasterxml/jackson/databind/deser/std/DateDeserializers.java

+4
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public static JsonDeserializer<?> find(Class<?> rawType, String clsName)
5858
return null;
5959
}
6060

61+
public static boolean hasDeserializerFor(Class<?> rawType) {
62+
return _classNames.contains(rawType.getName());
63+
}
64+
6165
/*
6266
/**********************************************************
6367
/* Intermediate class for Date-based ones

src/main/java/com/fasterxml/jackson/databind/deser/std/NumberDeserializers.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class NumberDeserializers
4141
}
4242
}
4343

44-
public static JsonDeserializer<?> find(Class<?> rawType, String clsName) {
44+
public static JsonDeserializer<?> find(Class<?> rawType) {
4545
if (rawType.isPrimitive()) {
4646
if (rawType == Integer.TYPE) {
4747
return IntegerDeserializer.primitiveInstance;
@@ -67,7 +67,7 @@ public static JsonDeserializer<?> find(Class<?> rawType, String clsName) {
6767
if (rawType == Float.TYPE) {
6868
return FloatDeserializer.primitiveInstance;
6969
}
70-
} else if (_classNames.contains(clsName)) {
70+
} else if (_classNames.contains(rawType.getName())) {
7171
// Start with most common types; int, boolean, long, double
7272
if (rawType == Integer.class) {
7373
return IntegerDeserializer.wrapperInstance;

src/main/java/com/fasterxml/jackson/databind/ext/CoreXMLDeserializers.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@ public static JsonDeserializer<?> findBeanDeserializer(DeserializationConfig con
4848
return null;
4949
}
5050

51-
@Override // since 2.11
52-
public boolean hasDeserializerFor(Class<?> valueType) {
51+
public static boolean hasDeserializerFor(Class<?> valueType) {
5352
return (valueType == QName.class)
5453
|| (valueType == XMLGregorianCalendar.class)
5554
|| (valueType == Duration.class)

src/main/java/com/fasterxml/jackson/databind/ext/OptionalHandlerFactory.java

+16
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,22 @@ public JsonDeserializer<?> findDeserializer(DeserializationConfig config, JavaTy
7676
return null;
7777
}
7878

79+
public boolean hasDeserializerFor(Class<?> valueType) {
80+
if ((CLASS_DOM_NODE != null) && CLASS_DOM_NODE.isAssignableFrom(valueType)) {
81+
return true;
82+
}
83+
if ((CLASS_DOM_DOCUMENT != null) && CLASS_DOM_DOCUMENT.isAssignableFrom(valueType)) {
84+
return true;
85+
}
86+
String className = valueType.getName();
87+
88+
if (className.startsWith(PACKAGE_PREFIX_JAVAX_XML)
89+
|| hasSuperClassStartingWith(valueType, PACKAGE_PREFIX_JAVAX_XML)) {
90+
return CoreXMLDeserializers.hasDeserializerFor(valueType);
91+
}
92+
return false;
93+
}
94+
7995
/*
8096
/**********************************************************************
8197
/* Internal helper methods

0 commit comments

Comments
 (0)