Spring Boot中Date类型出现JSON解析错误问题

问题描述:
在搭建Spring Boot项目时,客户端传输JSON包含日期数据,日期格式为:yyyy-MM-dd HH:mm,测试调用时报如下错误:

{
  "timestamp": "2020-04-21T08:39:21.810+0000",
  "status": 400,
  "error": "Bad Request",
  "message": "JSON parse error: Cannot deserialize value of type `java.util.Date` from String \"2020-04-21 16:16\": not a valid representation (error: Failed to parse Date value \u00272020-04-21 16:16\u0027: Cannot parse date \"2020-04-21 16:16\": while it seems to fit format \u0027yyyy-MM-dd\u0027T\u0027HH:mm:ss.SSSZ\u0027, parsing fails (leniency? null)); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String \"2020-04-21 16:16\": not a valid representation (error: Failed to parse Date value \u00272020-04-21 16:16\u0027: Cannot parse date \"2020-04-21 16:16\": while it seems to fit format \u0027yyyy-MM-dd\u0027T\u0027HH:mm:ss.SSSZ\u0027, parsing fails (leniency? null))\n at [Source: (PushbackInputStream); line: 4, column: 15] (through reference chain: com.chan.mybatis_anno.entities.Employee[\"hireDate\"])",
  "path": "/"
}

错误为:不能将日期字符串"2020-04-21 16:16"解析为java.util.Date

错误分析:

  1. Springboot使用的json解析框架默认是jackjson
  2. jackjson解析框架在解析实体类里面是date数据类型的数据时的默认格式是:UTC类型,即yyyy-MM-dd’T’HH:mm:ss.SSS,并且默认为+8时区,即时间基础上加8小时

解决方案:

  1. 在实体Date类型的字段上使用@JsonFormat注解格式化日期
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
  1. 通过下面方式取消timestamps形式
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

备注:
如果项目中使用json解析框架为fastjson框架,则可使用如下解决方法:

  1. 在实体字段上使用@JsonFormat注解格式化日期
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")

————————————————
版权声明:本文为CSDN博主「北辰之北灬」的原创文章
原文链接:https://blog.csdn.net/pp_fzp/article/details/79588374

原创文章 10 获赞 5 访问量 1700

猜你喜欢

转载自blog.csdn.net/qq_33736653/article/details/105662052