• 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类型的时间戳(毫秒时间戳)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    解决方法

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

    @DateTimeFormat

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

    • 仅支持前端使用表单键值对的请求提交方式,不支持Json格式的请求提交方式
      用法:
      请求URL : http://localhost:9999/putdate=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*/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    @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"
    }
    
    • 1
    • 2
    • 3

    后台接受

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

    传入的是12点,转成对象为20点。为什么?
    默认是传入的对象时区默认为UTC时区,现在服务器所在的时区是东8区,晚8小时,需要进行转换时区操作,加8。
    指定timezone

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

    传进来值,时区一样,无须转化时区。

    参考博客

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

  • 相关阅读:
    多线程(线程互斥)
    Win11 安装 Vim
    Net Core API +Vue Nginx集成发布
    Java自定义异常类详解及示例
    Springboot2 Pandas Pyecharts 量子科技专利课程设计大作业
    Bugku MISC做题笔记
    logback知识点
    基于SSM技术的oa办公管理系统的设计与实现毕业设计源码100934
    DDD技术方案落地实践
    Vue生命周期--Vue实例创建过程详解
  • 原文地址:https://blog.csdn.net/m0_67401417/article/details/126031282