@DateTimeFormat和@JsonFormat

1、准备

定义pojo类

@Data
public class DateVo {
    private Date date;
}

定义controller

@RestController
public class DateController {

    /**
     * 通过表单获取传递的数据
     * @param vo
     * @return
     */
    @PostMapping("/post_form_date")
    public DateVo postFormDate(DateVo vo) {
        System.out.println("date:" + vo.getDate());
        return vo;
    }

    /**
     * http body 中传递json格式数据
     * @param vo
     * @return
     */
    @PostMapping("/post_date")
    public DateVo postDate(@RequestBody DateVo vo) {
        System.out.println("date:" + vo.getDate());
        return vo;
    }
}

2、验证

未做任何处理的pojo类,在传入时间字符串是无法将String类型转为

Date,导致后台抛出异常。

img

后台抛出异常,提示无法将String转化为Date

img

2.1、使用DateTimeFormat解决

2.1.1、入参以表单方式传入时间类型字符串

使用DateTimeFormat注解修改pojo,并指定输入的日期格式。

@Data
public class DateVo {
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date date;
}

返回结果正确,但是返回的日期是未格式化的

如果入参格式未严格按照yyyy-MM-dd的格式输入,也是无法转化,例如“2020-8-12”是无法转化的,要入参改为“2020-08-12”。

img

2.1.2、入参以Http Body方式传入JSON时间类型字符串

以Http Body方式传入,后台的controller需要使用RequestBody注解。

返回结果正确,但是返回的日期是未格式化的。

img

2.2、使用JsonFormat解决

使用JsonFormat注解修改pojo,并指定输入的日期格式和时区。

@Data
public class DateVo {
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private Date date;
}

2.2.1、只能以Http Body方式传入JSON时间类型字符串

以Http Body方式传入,后台的controller需要使用RequestBody注解。

返回结果正确,但是返回的日期是格式化的。

img

3、使用

将pojo类的属性加入两个注解,可实现多种入参方式转化

@Data
public class DateVo {
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    private Date date;
}

4、区别

  1. DateTimeFormat注解的属性,可接收时间格式的字符串并转化为时间类型,但是字符串要严格遵守格式,例如“2020-8-12”是无法转化的,要写为2020-08-12。
  2. DateTimeFormat对响应实体的属性是不做格式化的。
  3. JsonFormat注解的属性,可将http body中传递时间格式的字符串并转化为时间类型,对响应的实体,也做格式化。
posted @ 2022-08-11 10:56  往事随雨  阅读(54)  评论(0)    收藏  举报