关于@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-Type 为 form-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起作用。

原文地址:https://www.cnblogs.com/lqwh/p/11229031.html

时间: 2024-12-23 16:09:37

关于@JsonFormat和@DateFormat问题的相关文章

Date、Calendar、DateFormat、SimpleDateFormat、Timer、TimerTask类

类 Date 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值. 它也允许格式化和解析日期字符串.不过,这些函数的 API 不易于实现国际化.从 JDK 1.1 开始,应 该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串. Date 中的相应方法已废弃. Date() 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒). Date(long date) 分配 D

Java API —— DateFormat类

1.DateFormat类概述         DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. 是抽象类,所以使用其子类SimpleDateFormat. 2.SimpleDateFormat构造方法     public SimpleDateFormat():将一个 Date 格式化为日期/时间字符串.(默认模式) public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造 S

Java基础知识强化92:DateFormat类之DateFormat实现日期和字符串的相互转换

1. DateFormat类概述: DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间. 是抽象类,所以使用其子类SimpleDateFormat 2. SimpleDateFormat构造方法: 1 public SimpleDateFormat() 2 public SimpleDateFormat(String pattern) 3. 成员方法 1 public final String format(Date date) 2 public D

java===Date,DateFormat,SimpleDateFormat,Calendar类

package 常用类.Date; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /**月份从0-11的整数表示,0是一月,11是12月 * 日期对象-->毫秒值 getTime方法: * 原因:可以通过毫秒值来进行日期运算 * 毫秒值-->日期对象 setTime方法或者构造方法new Date(毫秒

Date、DateFormat、Calendar、System、Math类总结

java.util.Date: 构造方法 public Date() 空参构造,返回当前时间 public Date(long 毫秒值) 指定毫秒值的时间 普通方法 long getTime() 获取毫秒值 viod setTime() 设置毫秒值 Date 指定毫秒数和Date类型的转换 Date d = new Date(); 重写toString方法:Sat Mar 25 15:33:29 CST 2017 java.text.DateFormat 日期格式化类 抽象类 将日期和指定格式字

解决JsonFormat日期少一天问题

使用Jackson的@JsonFormat注解时出现少一天 比如数据库存的日期是2015-01-05,转成json则变成了2015-01-04 解决办法: @JsonFormat(pattern="yyyy-MM-dd") private Date birth; 改成 @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private Date birth; 加上时区即可,中国是东八区

jackson 中JsonFormat date类型字段的使用

为了便于date类型字段的序列化和反序列化,需要在数据结构的date类型的字段上用JsonFormat注解进行注解具体格式如下 @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ", locale = "zh", timezone = "GMT+8") pattern 指定转化的格式,SSSZ(S指的是微秒,Z指时区)此处的pattern和java.text.SimpleDateFormat中的Ti

java25:SimpleDateFormat;DateFormat

SimpleDateFormat的作用 1:将Date 对象转换为特定格式的字符串   format方法 2:将字符串按照特定格式转换为Date对象    parse方法 package day25; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Demo07 { public static void main(String[] arg

DateFormat 中间加别的字符

private static DateFormat dateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");