Cannot deserialize value of type `java.util.Date` from String

Cannot deserialize value of type `java.util.Date` from StringJava中日期转换,接受前端,后端转为前端,接受键值对

com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.util.Date from String “2022-06-21 18:00:01”: not a valid representation (error: Failed to parse Date value ‘2022-06-21 18:00:01’: Cannot parse date “2022-06-21 18:00:01”: while it seems to fit format ‘yyyy-MM-dd’T’HH:mm:ss.SSSZ’, parsing fails (leniency? null))

翻译:不能反序列化java.util类型的值从字符串”2022-06-21 18:00:01″:不是一个有效的表示(错误:解析Date值’2022-06-21 18:00:01’失败:你能解析日期”2022-06-21 18:00:01″:而它似乎是和格式’yyyy-MM-dd’T’HH:mm:ss.SSSZ’,解析失败(宽大? 为null))

原因:因为传入的参数是 String 类型的,而用来接收参数的 DateVo 的 date 属性是 java.util.Date 类型的,类型无法转换。

springboot默认采用jackson,而jackson只能识别以下几种日期格式

"yyyy-MM-dd'T'HH:mm:ss.SSSZ";
 
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
 
"yyyy-MM-dd";
 
"EEE, dd MMM yyyy HH:mm:ss zzz";
 
long类型的时间戳(毫秒时间戳)

解决方法

  • 所以在接收到数据的时候,需要通过jackson把数据转化。jackson转化默认的时间格式 ‘yyyy-MM-dd’T’HH:mm:ss.SSS’,所以就会出现异常,所以要设置时区的格式为”yyyy-MM-dd HH:mm:ss”。
  • 采用long时间戳,如:1537191968000

@DateTimeFormat

  • 只能格式化前端传入的日期时间类型的参数,不能格式化后端传给前端的日期时间类字段

  • 仅支持前端使用表单键值对的请求提交方式,不支持Json格式的请求提交方式
    用法:
    请求URL : http://localhost:9999/put?date=2020-03-07 13:13:13

@PostMapping("put")
public User put(@DateTimeFormat(pattern = "yyyy-MM-dd HH") @RequestParam Date  date){ 
   
       System.out.println(date); // Sat Mar 07 13:00:00 CST 2020 // 可以看到分和秒都被忽略了。
}

错误用法

class User{ 
   
	@DateTimeFormat(pattern = "yyyy-MM-dd")  // 这样没有作用
   		private Date date;
   		/*getter setter*/
}

@JsonFormat

用于解决反序列化传值的情况

timezone解释:
意思是用于反序列化时,指定这个默认时区,也就是传进来的字符串的时区。默认是UTC就是:0时区。(因为服务器也有一个时区,所以要根据传进值的时区,进行转换,后续详细演示)

  • 能格式化前端传入的日期时间类型的参数,也能格式化后端传给前端的日期时间类字段

  • 仅支持Json格式的请求提交方式,不支持前端使用表单键值对的请求提交方式
    接受字符串转化为Date的实体

class User{ 
   
		  	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 这里未指明 传入字符串的时区
		    private Date date;
}

前台json格式请求

{ 
   
	"date":"2020-03-07 12:12:12"
}

后台接受

@PostMapping("put")
public User put(@RequestBody User user){ 
   
	System.out.println(user.getDate()); // Sat Mar 07 20:12:12 CST 2020
}

传入的是12点,转成对象为20点。为什么?
默认是传入的对象时区默认为UTC时区,也就是0时区,现在服务器所在的时区是东8区,晚8小时,因此进行自动转换时区操作,将传进来的时间加上差值8小时。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;

指定timezone为GMT+8,表示传进来的时间就是东8区的时间,我本地服务器也是东八区。传进来值,时区一样,无须转化时区。

参考博客

@DateTimeFormat 和 @JsonFormat 的详细研究,以及timezone=“GMT+8“的研究,时区问题(1)
Java前端如何发送date类型的参数给后端

今天的文章Cannot deserialize value of type `java.util.Date` from String分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/26679.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注