zoukankan      html  css  js  c++  java
  • 关于@JsonFormat和@DateFormat问题

    今天在调试web应用的时候,碰到时间序列化和反序列化问题,网上查的资料一般都是关于 @JsonFormat @DateFormat

    网上好多说的是 @JsonFormat 是 把 对象转 string 即序列化起作用,@DateFormat 是string 转 对象 即反序列化起作用,也有的说 @JsonFormat 序列化和反序列化都有作用。

    其实问题不是这个简单,到底谁起作用是有条件的。

    1、当前端请求 content-Type application/json

      请求到后端 string 转 对象 是 @JsonFormat 起作用。

    domain文件

    controller层

    postman发请求。

    从上面可以看出,后端反序列化出错

    现在我把注解换下,如下

    public class Test {
    
        @JsonFormat(pattern = "yyyy-MM-dd")
    //    @DateTimeFormat(pattern = "yyyy-MM-dd")
        private Date date1;
    
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    //    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date date2;
    
        public Date getDate1() {
            return date1;
        }
    
        public void setDate1(Date date1) {
            this.date1 = date1;
        }
    
        public Date getDate2() {
            return date2;
        }
    
        public void setDate2(Date date2) {
            this.date2 = date2;
        }
    
    }

    此时后端能调通,且返回的结果时间格式是正确的,我们可以发现这种情况下@JsonFormat在反序列化和序列化过程都起作用了。

    2、当请求类型:content-Typeform-data

    此时domain还和上面一样,请求url换func1,因为这里content-Type 为 form-data

    把注解换成如下

    public class Test {
    
    //    @JsonFormat(pattern = "yyyy-MM-dd")
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private Date date1;
    
    //    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date date2;
    
        public Date getDate1() {
            return date1;
        }
    
        public void setDate1(Date date1) {
            this.date1 = date1;
        }
    
        public Date getDate2() {
            return date2;
        }
    
        public void setDate2(Date date2) {
            this.date2 = date2;
        }
    
    }

        此时能调通,string 转 对象 @DateFormat起作用。

    把domain改为:

    public class Test {
    
        @JsonFormat(pattern = "yyyy-MM-dd")
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private Date date1;
    
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date date2;
    
        public Date getDate1() {
            return date1;
        }
    
        public void setDate1(Date date1) {
            this.date1 = date1;
        }
    
        public Date getDate2() {
            return date2;
        }
    
        public void setDate2(Date date2) {
            this.date2 = date2;
        }
    
    }

    结果:

    此时 前端传后端string 转 对象是@DateFormat 起作用,后端传前端 对象 转string 是@DateFormat起作用。

    总结:
    1、@JsonFormat有序列化(对象转string)和反序列化(string转对象)的作用。
    2、当前端数据类型为application/json时@JsonFormat一个注解就可以起到序列化和反序列化的左右。
    3、当前端数据类型为multipart/form-data是,前端传后端 string转date @DateFormat起作用,后端传前端 @JsonFormat起作用。

  • 相关阅读:
    软件工程之美8讲——怎样平衡软件质量与时间成本范围的关系?
    软件工程之美7讲——大厂都在用哪些敏捷方法?(下)
    软件工程之美6讲——大厂都在用哪些敏捷方法?(上)
    C++问题少年系列
    有点捞的算法笔记
    UnityEditor简单介绍及案例
    数据可视化之图表用法(参考Antv整理)
    【思维导图】携程平台化常态化数据治理之路
    李宏毅2021机器学习/深度学习视频笔记
    力扣动态规划中等题困难题+背包问题DP专题202108012
  • 原文地址:https://www.cnblogs.com/lqwh/p/11229031.html
Copyright © 2011-2022 走看看