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

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类型的参数给后端

  • 24
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值