1
1
package com .fasterxml .jackson .databind .ext ;
2
2
3
+ import java .util .HashMap ;
4
+ import java .util .Map ;
5
+
3
6
import com .fasterxml .jackson .databind .*;
4
7
import com .fasterxml .jackson .databind .deser .Deserializers ;
5
8
import com .fasterxml .jackson .databind .ser .Serializers ;
@@ -74,8 +77,19 @@ public class OptionalHandlerFactory implements java.io.Serializable
74
77
}
75
78
76
79
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
+ }
79
93
80
94
/*
81
95
/**********************************************************
@@ -89,7 +103,7 @@ public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType typ
89
103
final Class <?> rawType = type .getRawClass ();
90
104
91
105
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 );
93
107
}
94
108
95
109
if (_jdk7Helper != null ) {
@@ -107,7 +121,7 @@ public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType typ
107
121
return null ;
108
122
}
109
123
110
- Object ob = instantiate (factoryName );
124
+ Object ob = instantiate (factoryName , type );
111
125
if (ob == null ) { // could warn, if we had logging system (j.u.l?)
112
126
return null ;
113
127
}
@@ -127,20 +141,24 @@ public JsonDeserializer<?> findDeserializer(JavaType type, DeserializationConfig
127
141
}
128
142
}
129
143
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 );
131
145
}
132
146
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 );
134
148
}
135
149
String className = rawType .getName ();
150
+ final String deserName = _sqlClasses .get (className );
151
+ if (deserName != null ) {
152
+ return (JsonDeserializer <?>) instantiate (deserName , type );
153
+ }
136
154
String factoryName ;
137
155
if (className .startsWith (PACKAGE_PREFIX_JAVAX_XML )
138
156
|| hasSuperClassStartingWith (rawType , PACKAGE_PREFIX_JAVAX_XML )) {
139
157
factoryName = DESERIALIZERS_FOR_JAVAX_XML ;
140
158
} else {
141
159
return null ;
142
160
}
143
- Object ob = instantiate (factoryName );
161
+ Object ob = instantiate (factoryName , type );
144
162
if (ob == null ) { // could warn, if we had logging system (j.u.l?)
145
163
return null ;
146
164
}
@@ -159,7 +177,8 @@ public boolean hasDeserializerFor(Class<?> valueType) {
159
177
|| hasSuperClassStartingWith (valueType , PACKAGE_PREFIX_JAVAX_XML )) {
160
178
return true ;
161
179
}
162
- return false ;
180
+ // 06-Nov-2020, tatu: One of "java.sql" types?
181
+ return _sqlClasses .containsKey (className );
163
182
}
164
183
165
184
/*
@@ -168,14 +187,15 @@ public boolean hasDeserializerFor(Class<?> valueType) {
168
187
/**********************************************************
169
188
*/
170
189
171
- private Object instantiate (String className )
190
+ private Object instantiate (String className , JavaType valueType )
172
191
{
173
192
try {
174
193
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
+ }
179
199
}
180
200
181
201
/**
0 commit comments