Skip to content

Commit 3f3cf57

Browse files
committed
Work on #2539
1 parent 10cd291 commit 3f3cf57

File tree

5 files changed

+81
-11
lines changed

5 files changed

+81
-11
lines changed

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

+47-9
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ private JavaType _mapAbstractType2(DeserializationConfig config, JavaType type)
193193

194194
/*
195195
/**********************************************************
196-
/* JsonDeserializerFactory impl (partial): ValueInstantiators
196+
/* DeserializerFactory impl (partial): ValueInstantiators
197197
/**********************************************************
198198
*/
199199

@@ -1108,7 +1108,7 @@ protected PropertyMetadata _getSetterInfo(DeserializationContext ctxt,
11081108

11091109
/*
11101110
/**********************************************************
1111-
/* JsonDeserializerFactory impl: array deserializers
1111+
/* DeserializerFactory impl: array deserializers
11121112
/**********************************************************
11131113
*/
11141114

@@ -1154,7 +1154,7 @@ public JsonDeserializer<?> createArrayDeserializer(DeserializationContext ctxt,
11541154

11551155
/*
11561156
/**********************************************************************
1157-
/* JsonDeserializerFactory impl: Collection(-like) deserializers
1157+
/* DeserializerFactory impl: Collection(-like) deserializers
11581158
/**********************************************************************
11591159
*/
11601160

@@ -1283,7 +1283,7 @@ public JsonDeserializer<?> createCollectionLikeDeserializer(DeserializationConte
12831283

12841284
/*
12851285
/**********************************************************
1286-
/* JsonDeserializerFactory impl: Map(-like) deserializers
1286+
/* DeserializerFactory impl: Map(-like) deserializers
12871287
/**********************************************************
12881288
*/
12891289

@@ -1443,7 +1443,7 @@ public JsonDeserializer<?> createMapLikeDeserializer(DeserializationContext ctxt
14431443

14441444
/*
14451445
/**********************************************************
1446-
/* JsonDeserializerFactory impl: other types
1446+
/* DeserializerFactory impl: other types
14471447
/**********************************************************
14481448
*/
14491449

@@ -1560,7 +1560,7 @@ public JsonDeserializer<?> createReferenceDeserializer(DeserializationContext ct
15601560

15611561
/*
15621562
/**********************************************************
1563-
/* JsonDeserializerFactory impl (partial): type deserializers
1563+
/* DeserializerFactory impl (partial): type deserializers
15641564
/**********************************************************
15651565
*/
15661566

@@ -1616,13 +1616,13 @@ protected JsonDeserializer<?> findOptionalStdDeserializer(DeserializationContext
16161616
{
16171617
return OptionalHandlerFactory.instance.findDeserializer(type, ctxt.getConfig(), beanDesc);
16181618
}
1619-
1619+
16201620
/*
16211621
/**********************************************************
1622-
/* JsonDeserializerFactory impl (partial): key deserializers
1622+
/* DeserializerFactory impl (partial): key deserializers
16231623
/**********************************************************
16241624
*/
1625-
1625+
16261626
@Override
16271627
public KeyDeserializer createKeyDeserializer(DeserializationContext ctxt,
16281628
JavaType type)
@@ -1718,6 +1718,44 @@ private KeyDeserializer _createEnumKeyDeserializer(DeserializationContext ctxt,
17181718
return StdKeyDeserializers.constructEnumKeyDeserializer(enumRes);
17191719
}
17201720

1721+
/*
1722+
/**********************************************************
1723+
/* DeserializerFactory impl: checking explicitly registered desers
1724+
/**********************************************************
1725+
*/
1726+
1727+
@Override
1728+
public boolean hasExplicitDeserializerFor(DeserializationConfig config,
1729+
Class<?> valueType) {
1730+
// Yes, we handle all Enum types
1731+
if (Enum.class.isAssignableFrom(valueType)) {
1732+
return true;
1733+
}
1734+
// Numbers?
1735+
final String clsName = valueType.getName();
1736+
if (clsName.startsWith("java.")) {
1737+
if (Number.class.isAssignableFrom(valueType)) {
1738+
return NumberDeserializers.find(valueType, clsName) != null;
1739+
}
1740+
if ((valueType == CLASS_STRING)
1741+
|| (valueType == Boolean.class)
1742+
|| (valueType == EnumMap.class)
1743+
|| (valueType == AtomicReference.class)
1744+
) {
1745+
return true;
1746+
}
1747+
if (DateDeserializers.hasDeserializerFor(valueType)) {
1748+
return true;
1749+
}
1750+
} else if (clsName.startsWith("com.fasterxml.")) {
1751+
return JsonNode.class.isAssignableFrom(valueType)
1752+
|| (valueType == TokenBuffer.class);
1753+
} else {
1754+
return OptionalHandlerFactory.instance.hasDeserializerFor(valueType);
1755+
}
1756+
return false;
1757+
}
1758+
17211759
/*
17221760
/**********************************************************
17231761
/* Extended API

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

+12
Original file line numberDiff line numberDiff line change
@@ -201,4 +201,16 @@ public abstract KeyDeserializer createKeyDeserializer(DeserializationContext ctx
201201
public abstract TypeDeserializer findTypeDeserializer(DeserializationConfig config,
202202
JavaType baseType)
203203
throws JsonMappingException;
204+
205+
/**
206+
* Method that can be used to check if databind module has deserializer
207+
* for given (likely JDK) type: explicit meaning that it is not automatically
208+
* generated for POJO.
209+
*<p>
210+
* This matches {@code Deserializers.Base.hasDeserializerFor(Class)} method.
211+
*
212+
* @since 2.11
213+
*/
214+
public abstract boolean hasExplicitDeserializerFor(DeserializationConfig config,
215+
Class<?> valueType);
204216
}

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

+5
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ public static JsonDeserializer<?> find(Class<?> rawType, String clsName)
6060
return null;
6161
}
6262

63+
// @since 2.11
64+
public static boolean hasDeserializerFor(Class<?> rawType) {
65+
return _classNames.contains(rawType.getName());
66+
}
67+
6368
/*
6469
/**********************************************************
6570
/* Intermediate class for Date-based ones

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public static JsonDeserializer<?> find(Class<?> rawType, String clsName) {
108108
// should never occur
109109
throw new IllegalArgumentException("Internal error: can't find deserializer for "+rawType.getName());
110110
}
111-
111+
112112
/*
113113
/**********************************************************
114114
/* Then one intermediate base class for things that have

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,22 @@ public JsonDeserializer<?> findDeserializer(JavaType type, DeserializationConfig
146146
}
147147
return ((Deserializers) ob).findBeanDeserializer(type, config, beanDesc);
148148
}
149-
149+
150+
public boolean hasDeserializerFor(Class<?> valueType) {
151+
if ((CLASS_DOM_NODE != null) && CLASS_DOM_NODE.isAssignableFrom(valueType)) {
152+
return true;
153+
}
154+
if ((CLASS_DOM_DOCUMENT != null) && CLASS_DOM_DOCUMENT.isAssignableFrom(valueType)) {
155+
return true;
156+
}
157+
String className = valueType.getName();
158+
if (className.startsWith(PACKAGE_PREFIX_JAVAX_XML)
159+
|| hasSuperClassStartingWith(valueType, PACKAGE_PREFIX_JAVAX_XML)) {
160+
return true;
161+
}
162+
return false;
163+
}
164+
150165
/*
151166
/**********************************************************
152167
/* Internal helper methods

0 commit comments

Comments
 (0)