问题
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.sql.Timestamp` from String "2024-02-20 19:34:16.0": expected format "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
详细问题
笔者进行Android项目开发,客户端请求所传递参数含Timestamp类型数据,使用com.fasterxml.jackson
对JSON数据进行解析,控制台报错,详细报错如下:
2024-02-20 19:34:34.955 WARN 34104 --- [nio-9090-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.sql.Timestamp` from String "2024-02-20 19:34:16.0": expected format "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.sql.Timestamp` from String "2024-02-20 19:34:16.0": expected format "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"<EOL> at [Source: (PushbackInputStream); line: 9, column: 19] (through reference chain: com.qingge.springboot.entity.User["createTime"])]
解决方案
将日期格式化:
public static String convertDateFormat(String inputDate) {
// 定义输入日期格式和输出日期格式
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
// 将输入日期字符串解析为 LocalDateTime 对象
LocalDateTime dateTime = LocalDateTime.parse(inputDate, inputFormatter);
// 将 LocalDateTime 对象格式化为输出日期字符串,并指定时区为东八区
return dateTime.atZone(ZoneId.of("Asia/Shanghai")).format(outputFormatter);
}
产生原因
问题产生的原因是在客户端向服务器发送请求时,传递的JSON数据中包含了Timestamp类型的数据,并且这些数据的格式与服务器端预期的格式不匹配。具体来说,服务器端期望接收的Timestamp类型数据格式为"yyyy-MM-dd’T’HH:mm:ss.SSS’Z’“,但实际传递的数据格式为"yyyy-MM-dd HH:mm:ss.S”。
由于JSON数据在传输过程中需要进行反序列化操作,服务器端使用Jackson库进行JSON数据的反序列化。然而,Jackson库无法将实际传递的数据格式"yyyy-MM-dd HH:mm:ss.S"转换为服务器端期望的格式"yyyy-MM-dd’T’HH:mm:ss.SSS’Z’",导致反序列化失败,进而抛出了HttpMessageNotReadableException异常。
解决原因
为了解决这个问题,开发者需要在客户端对日期数据进行格式化,将其转换为服务器端期望的格式"yyyy-MM-dd’T’HH:mm:ss.SSS’Z’",以保证数据的一致性和可解析性。上述提供的解决方案中,通过convertDateFormat方法将日期格式化为符合服务器端期望格式的字符串,并且指定时区为东八区(即"Asia/Shanghai"时区),以确保数据的正确性。
参考文献
产生原因与解释原因部分 部分内容参考chatgpt
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈