Skip to content

Commit 10cd291

Browse files
committed
Start work on adding "hasDeserializerFor" for Deserializers
1 parent dafb4c1 commit 10cd291

File tree

5 files changed

+49
-8
lines changed

5 files changed

+49
-8
lines changed

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

+28-6
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,9 @@ public JsonDeserializer<?> findMapLikeDeserializer(MapLikeType type,
235235
TypeDeserializer elementTypeDeserializer, JsonDeserializer<?> elementDeserializer)
236236
throws JsonMappingException;
237237

238+
// To be added in 3.0
239+
// public boolean hasDeserializerFor(Class<?> valueType);
240+
238241
/*
239242
/**********************************************************
240243
/* Helper classes
@@ -248,7 +251,8 @@ public JsonDeserializer<?> findMapLikeDeserializer(MapLikeType type,
248251
* of methods are not needed (especially enumeration and array deserializers are
249252
* very rarely overridden).
250253
*/
251-
public static class Base implements Deserializers
254+
public abstract static class Base
255+
implements Deserializers
252256
{
253257
@Override
254258
public JsonDeserializer<?> findEnumDeserializer(Class<?> type,
@@ -266,14 +270,13 @@ public JsonDeserializer<?> findTreeNodeDeserializer(Class<? extends JsonNode> no
266270
return null;
267271
}
268272

269-
@Override // since 2.7
273+
@Override
270274
public JsonDeserializer<?> findReferenceDeserializer(ReferenceType refType,
271275
DeserializationConfig config, BeanDescription beanDesc,
272276
TypeDeserializer contentTypeDeserializer, JsonDeserializer<?> contentDeserializer)
273-
throws JsonMappingException {
274-
// 21-Oct-2015, tatu: For backwards compatibility, let's delegate to "bean" variant,
275-
// for 2.7 -- remove work-around from 2.8 or later
276-
return findBeanDeserializer(refType, config, beanDesc);
277+
throws JsonMappingException
278+
{
279+
return null;
277280
}
278281

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

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

+8
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,14 @@ public JsonDeserializer<?> findBeanDeserializer(JavaType type,
5050
return null;
5151
}
5252

53+
@Override // since 2.11
54+
public boolean hasDeserializerFor(Class<?> valueType) {
55+
return (valueType == QName.class)
56+
|| (valueType == XMLGregorianCalendar.class)
57+
|| (valueType == Duration.class)
58+
;
59+
}
60+
5361
/*
5462
/**********************************************************
5563
/* Concrete deserializers

src/main/java/com/fasterxml/jackson/databind/module/SimpleDeserializers.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
* all mappings must be to exact declared deserialization type.
1919
*/
2020
public class SimpleDeserializers
21-
implements Deserializers, java.io.Serializable
21+
extends Deserializers.Base
22+
implements java.io.Serializable
2223
{
2324
private static final long serialVersionUID = 1L;
2425

@@ -78,7 +79,7 @@ public void addDeserializers(Map<Class<?>,JsonDeserializer<?>> desers)
7879
/* Serializers implementation
7980
/**********************************************************
8081
*/
81-
82+
8283
@Override
8384
public JsonDeserializer<?> findArrayDeserializer(ArrayType type,
8485
DeserializationConfig config, BeanDescription beanDesc,
@@ -180,6 +181,12 @@ public JsonDeserializer<?> findMapLikeDeserializer(MapLikeType type,
180181
return _find(type);
181182
}
182183

184+
@Override // since 2.11
185+
public boolean hasDeserializerFor(Class<?> valueType) {
186+
return (_classMappings != null)
187+
&& _classMappings.containsKey(new ClassKey(valueType));
188+
}
189+
183190
private final JsonDeserializer<?> _find(JavaType type) {
184191
if (_classMappings == null) {
185192
return null;

src/test/java/com/fasterxml/jackson/databind/deser/creators/EnumCreatorTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ public JsonDeserializer<?> findEnumDeserializer(final Class<?> type, final Deser
115115
}
116116
return null;
117117
}
118+
@Override
119+
public boolean hasDeserializerFor(Class<?> valueType) { return false; }
118120
}
119121

120122
// [databind#745]

src/test/java/com/fasterxml/jackson/databind/deser/creators/TestCreatorNullValue.java

+2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public JsonDeserializer<?> findBeanDeserializer(JavaType type,
4848
}
4949
return new ContainedDeserializer();
5050
}
51+
@Override
52+
public boolean hasDeserializerFor(Class<?> valueType) { return false; }
5153
}
5254

5355
protected static class TestModule extends com.fasterxml.jackson.databind.Module

0 commit comments

Comments
 (0)