项目中使用了redis做缓存,之前使用的SSM框架,没有出现什么问题。后来将SSM换成Springboot后,莫名其妙的出现了以下错误:
关键报错信息:
com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.util.Date from String "2017-06-04 19:12:58": not a valid representation (error: Failed to parse Date value '2017-06-04 19:12:58': Can not parse date "2017-06-04 19:12:58": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS', parsing fails (leniency? null))
错误信息中说是因为解析Date日期出现报错,debug查看一下,错误信息由以下方法抛出:
最终的原因,是因为解析日期的StdDateFormat对象不支持"yyyy-MM-dd HH:mm:ss"的格式,导致解析出错
解决方法是自定义一个支持 'yyyy-MM-dd'T'HH:mm:ss' Date解析类SimpleDateFormat,将其注入ObjectMapper对象中。可以编写一个工具类:
/**
* 实现JSON字符串与Java对象的相互转换的工具类
* @author kero
* @date 2018-03-24 23:14:12
* @version 1.0
*/
public class JsonUtil {
// 获取原始的 ObjectMapper 对象
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 获取自定义 ObjectMapper 的方法
* @return
*/
private static final ObjectMapper getMapper() {
ObjectMapper mapper = new ObjectMapper();
// 设置自定义的 SimpleDateFormat,该对象支持"yyyy-MM-dd HH:mm:ss"格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
return mapper;
}
/**
* 将Json字符串转换成Java对象
* @param jsonData 要进行转换的Json字符串
* @param targetClass 要转换成的Java对象的class
* @return
*/
public static <T> T jsonToObject(String jsonData, Class<T> targetClass) {
try {
// 先使用自定义的ObjectMapper进行解析
return getMapper().readValue(jsonData, targetClass);
} catch (Exception e) {
try {
// 如果解析失败则,使用默认的 ObjectMapper 进行解析
return MAPPER.readValue(jsonData, targetClass);
} catch (IOException e1) {
e1.printStackTrace();
}
}
return null;
}
}