Skip to content

Commit 5d0e6e5

Browse files
committed
More work from #2913 base (in 2.13 need to move java.sql deserializers under ext or something)
1 parent 97f741b commit 5d0e6e5

File tree

2 files changed

+34
-28
lines changed

2 files changed

+34
-28
lines changed

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

+1-15
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,10 @@
2525
public class DateDeserializers
2626
{
2727
private final static HashSet<String> _utilClasses = new HashSet<String>();
28-
29-
// classes from java.sql module, this module may not be present at runtime
30-
private final static HashSet<String> _sqlClasses = new HashSet<String>();
3128
static {
3229
_utilClasses.add("java.util.Calendar");
3330
_utilClasses.add("java.util.GregorianCalendar");
3431
_utilClasses.add("java.util.Date");
35-
36-
_sqlClasses.add("java.sql.Date");
37-
_sqlClasses.add("java.sql.Timestamp");
3832
}
3933

4034
public static JsonDeserializer<?> find(Class<?> rawType, String clsName)
@@ -51,20 +45,12 @@ public static JsonDeserializer<?> find(Class<?> rawType, String clsName)
5145
return new CalendarDeserializer(GregorianCalendar.class);
5246
}
5347
}
54-
if (_sqlClasses.contains(clsName)) {
55-
if (rawType == java.sql.Date.class) {
56-
return new SqlDateDeserializer();
57-
}
58-
if (rawType == java.sql.Timestamp.class) {
59-
return new TimestampDeserializer();
60-
}
61-
}
6248
return null;
6349
}
6450

6551
// @since 2.11
6652
public static boolean hasDeserializerFor(Class<?> rawType) {
67-
return _utilClasses.contains(rawType.getName()) || _sqlClasses.contains(rawType.getName());
53+
return _utilClasses.contains(rawType.getName());
6854
}
6955

7056
/*

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

+33-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.fasterxml.jackson.databind.ext;
22

3+
import java.util.HashMap;
4+
import java.util.Map;
5+
36
import com.fasterxml.jackson.databind.*;
47
import com.fasterxml.jackson.databind.deser.Deserializers;
58
import com.fasterxml.jackson.databind.ser.Serializers;
@@ -74,8 +77,19 @@ public class OptionalHandlerFactory implements java.io.Serializable
7477
}
7578

7679
public final static OptionalHandlerFactory instance = new OptionalHandlerFactory();
77-
78-
protected OptionalHandlerFactory() { }
80+
81+
// classes from java.sql module, this module may not be present at runtime
82+
private final Map<String, String> _sqlClasses;
83+
84+
protected OptionalHandlerFactory() {
85+
_sqlClasses = new HashMap<>();
86+
try {
87+
_sqlClasses.put("java.sql.Date",
88+
"com.fasterxml.jackson.databind.deser.std.DateDeserializers$SqlDateDeserializer");
89+
_sqlClasses.put("java.sql.Timestamp",
90+
"com.fasterxml.jackson.databind.deser.std.DateDeserializers$TimestampDeserializer");
91+
} catch (Throwable t) { }
92+
}
7993

8094
/*
8195
/**********************************************************
@@ -89,7 +103,7 @@ public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType typ
89103
final Class<?> rawType = type.getRawClass();
90104

91105
if ((CLASS_DOM_NODE != null) && CLASS_DOM_NODE.isAssignableFrom(rawType)) {
92-
return (JsonSerializer<?>) instantiate(SERIALIZER_FOR_DOM_NODE);
106+
return (JsonSerializer<?>) instantiate(SERIALIZER_FOR_DOM_NODE, type);
93107
}
94108

95109
if (_jdk7Helper != null) {
@@ -107,7 +121,7 @@ public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType typ
107121
return null;
108122
}
109123

110-
Object ob = instantiate(factoryName);
124+
Object ob = instantiate(factoryName, type);
111125
if (ob == null) { // could warn, if we had logging system (j.u.l?)
112126
return null;
113127
}
@@ -127,20 +141,24 @@ public JsonDeserializer<?> findDeserializer(JavaType type, DeserializationConfig
127141
}
128142
}
129143
if ((CLASS_DOM_NODE != null) && CLASS_DOM_NODE.isAssignableFrom(rawType)) {
130-
return (JsonDeserializer<?>) instantiate(DESERIALIZER_FOR_DOM_NODE);
144+
return (JsonDeserializer<?>) instantiate(DESERIALIZER_FOR_DOM_NODE, type);
131145
}
132146
if ((CLASS_DOM_DOCUMENT != null) && CLASS_DOM_DOCUMENT.isAssignableFrom(rawType)) {
133-
return (JsonDeserializer<?>) instantiate(DESERIALIZER_FOR_DOM_DOCUMENT);
147+
return (JsonDeserializer<?>) instantiate(DESERIALIZER_FOR_DOM_DOCUMENT, type);
134148
}
135149
String className = rawType.getName();
150+
final String deserName = _sqlClasses.get(className);
151+
if (deserName != null) {
152+
return (JsonDeserializer<?>) instantiate(deserName, type);
153+
}
136154
String factoryName;
137155
if (className.startsWith(PACKAGE_PREFIX_JAVAX_XML)
138156
|| hasSuperClassStartingWith(rawType, PACKAGE_PREFIX_JAVAX_XML)) {
139157
factoryName = DESERIALIZERS_FOR_JAVAX_XML;
140158
} else {
141159
return null;
142160
}
143-
Object ob = instantiate(factoryName);
161+
Object ob = instantiate(factoryName, type);
144162
if (ob == null) { // could warn, if we had logging system (j.u.l?)
145163
return null;
146164
}
@@ -159,7 +177,8 @@ public boolean hasDeserializerFor(Class<?> valueType) {
159177
|| hasSuperClassStartingWith(valueType, PACKAGE_PREFIX_JAVAX_XML)) {
160178
return true;
161179
}
162-
return false;
180+
// 06-Nov-2020, tatu: One of "java.sql" types?
181+
return _sqlClasses.containsKey(className);
163182
}
164183

165184
/*
@@ -168,14 +187,15 @@ public boolean hasDeserializerFor(Class<?> valueType) {
168187
/**********************************************************
169188
*/
170189

171-
private Object instantiate(String className)
190+
private Object instantiate(String className, JavaType valueType)
172191
{
173192
try {
174193
return ClassUtil.createInstance(Class.forName(className), false);
175-
} catch (LinkageError e) { }
176-
// too many different kinds to enumerate here:
177-
catch (Exception e) { }
178-
return null;
194+
} catch (Throwable e) {
195+
throw new IllegalStateException("Failed to create instance of `"
196+
+className+"` for handling values of type "+ClassUtil.getTypeDescription(valueType)
197+
+", problem: ("+e.getClass().getName()+") "+e.getMessage());
198+
}
179199
}
180200

181201
/**

0 commit comments

Comments
 (0)