11package com .fasterxml .jackson .databind .ext ;
22
3+ import java .util .HashMap ;
4+ import java .util .Map ;
5+
36import com .fasterxml .jackson .databind .*;
47import com .fasterxml .jackson .databind .deser .Deserializers ;
58import 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