修复jdk9模块化导致的NoClassDefFoundError: java/sql/Timestamp

This commit is contained in:
luyanbo
2021-08-29 12:50:58 +08:00
parent c5695ab27d
commit f10d080d45
6 changed files with 863 additions and 758 deletions
@@ -429,13 +429,13 @@ public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAc
return castToDate(value);
}
public java.sql.Date getSqlDate(int index) {
public Object getSqlDate(int index) {
Object value = get(index);
return castToSqlDate(value);
}
public java.sql.Timestamp getTimestamp(int index) {
public Object getTimestamp(int index) {
Object value = get(index);
return castToTimestamp(value);
@@ -337,13 +337,13 @@ public class JSONObject extends JSON implements Map<String, Object>, Cloneable,
return castToDate(value);
}
public java.sql.Date getSqlDate(String key) {
public Object getSqlDate(String key) {
Object value = get(key);
return castToSqlDate(value);
}
public java.sql.Timestamp getTimestamp(String key) {
public Object getTimestamp(String key) {
Object value = get(key);
return castToTimestamp(value);
@@ -31,6 +31,7 @@ import java.nio.charset.Charset;
import java.security.AccessControlException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -401,12 +402,18 @@ public class ParserConfig {
}
private final Callable<Void> initDeserializersWithJavaSql = new Callable<Void>() {
public Void call() {
deserializers.put(java.sql.Timestamp.class, SqlDateDeserializer.instance_timestamp);
deserializers.put(java.sql.Date.class, SqlDateDeserializer.instance);
deserializers.put(java.sql.Time.class, TimeDeserializer.instance);
deserializers.put(java.util.Date.class, DateCodec.instance);
return null;
}
};
private void initDeserializers() {
deserializers.put(SimpleDateFormat.class, MiscCodec.instance);
deserializers.put(java.sql.Timestamp.class, SqlDateDeserializer.instance_timestamp);
deserializers.put(java.sql.Date.class, SqlDateDeserializer.instance);
deserializers.put(java.sql.Time.class, TimeDeserializer.instance);
deserializers.put(java.util.Date.class, DateCodec.instance);
deserializers.put(Calendar.class, CalendarCodec.instance);
deserializers.put(XMLGregorianCalendar.class, CalendarCodec.instance);
@@ -482,6 +489,7 @@ public class ParserConfig {
deserializers.put(Closeable.class, JavaObjectDeserializer.instance);
deserializers.put(JSONPObject.class, new JSONPDeserializer());
ModuleUtil.callWhenHasJavaSql(initDeserializersWithJavaSql);
}
private static String[] splitItemsFormProperty(final String property ){
@@ -1155,28 +1163,37 @@ public class ParserConfig {
return isPrimitive2(clazz);
}
private static Function<Class<?>, Boolean> isPrimitiveFuncation = new Function<Class<?>, Boolean>() {
public Boolean apply(Class<?> clazz) {
return clazz == java.sql.Date.class //
|| clazz == java.sql.Time.class //
|| clazz == java.sql.Timestamp.class;
}
};
/**
* @deprecated internal method, dont call
*/
public static boolean isPrimitive2(Class<?> clazz) {
return clazz.isPrimitive() //
|| clazz == Boolean.class //
|| clazz == Character.class //
|| clazz == Byte.class //
|| clazz == Short.class //
|| clazz == Integer.class //
|| clazz == Long.class //
|| clazz == Float.class //
|| clazz == Double.class //
|| clazz == BigInteger.class //
|| clazz == BigDecimal.class //
|| clazz == String.class //
|| clazz == java.util.Date.class //
|| clazz == java.sql.Date.class //
|| clazz == java.sql.Time.class //
|| clazz == java.sql.Timestamp.class //
|| clazz.isEnum() //
;
public static boolean isPrimitive2(final Class<?> clazz) {
Boolean primitive = clazz.isPrimitive() //
|| clazz == Boolean.class //
|| clazz == Character.class //
|| clazz == Byte.class //
|| clazz == Short.class //
|| clazz == Integer.class //
|| clazz == Long.class //
|| clazz == Float.class //
|| clazz == Double.class //
|| clazz == BigInteger.class //
|| clazz == BigDecimal.class //
|| clazz == String.class //
|| clazz == java.util.Date.class //
|| clazz.isEnum() //
;
if (!primitive) {
primitive = ModuleUtil.callWhenHasJavaSql(isPrimitiveFuncation, clazz);
}
return primitive != null ? primitive : false;
}
/**
@@ -0,0 +1,10 @@
package com.alibaba.fastjson.util;
public interface Function<ARG, V> {
/**
* Computes a result
*
* @return computed result
*/
V apply(ARG arg);
}
@@ -0,0 +1,34 @@
package com.alibaba.fastjson.util;
import java.util.concurrent.Callable;
public class ModuleUtil {
private static boolean hasJavaSql = false;
static {
try {
Class.forName("java.sql.Time");
hasJavaSql = true;
} catch (Throwable e) {
hasJavaSql = false;
}
}
public static <T> T callWhenHasJavaSql(Callable<T> callable) {
if (hasJavaSql) {
try {
return callable.call();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return null;
}
public static <ARG, T> T callWhenHasJavaSql(Function<ARG, T> callable, ARG arg) {
if (hasJavaSql) {
return callable.apply(arg);
}
return null;
}
}
File diff suppressed because it is too large Load Diff