@DateTimeFormat与@JsonFormat不完全解析

目录

    • 前言
    • 测试代码
    • @DateTimeFormat
      • 不加任何注解的情况
      • 普通请求
      • JSON请求
    • @JsonFormat
      • 普通请求
      • JSON请求
    • 其他方式(@InitBinder)
    • 结论
    • 源码地址

前言

  • 一直以来对@DateTimeFormat@JsonFormat 比较模糊,容易搞忘,今天就做个笔记,由于不设计原理,源码所以是不完全解析,有时间再看下源码。
  • 如果时间急的,可以不看验证过程,直接看结论

测试代码

  • 下面是基本代码:
  • 实体类
public class User {

    public final static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    private String name;

    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

  • controller
@RestController
public class TestController {

    @RequestMapping("/test")
    public User test(User user){
        return user;
    }
}

@DateTimeFormat

不加任何注解的情况

  • 我使用postman传递birthday参数不成功。

在这里插入图片描述
@DateTimeFormat与@JsonFormat不完全解析_第1张图片

  • 取消birthday正常。
    @DateTimeFormat与@JsonFormat不完全解析_第2张图片

普通请求

  • 那我们加上@DateTimeFormat看看。
   @DateTimeFormat(pattern = YYYY_MM_DD_HH_MM_SS)
    private Date birthday;
  • 加入之后GET/POST都成功
    @DateTimeFormat与@JsonFormat不完全解析_第3张图片

@DateTimeFormat与@JsonFormat不完全解析_第4张图片

JSON请求

  • 再来测试请求参数是json的情况。
   @RequestMapping("/test")
    public User test(@RequestBody User user){
        return user;
    }
  • 先单独尝试name参数,以免干扰。

@DateTimeFormat与@JsonFormat不完全解析_第5张图片

  • name参数成功,再加上birthday参数,有异常,传JSON不行。

@DateTimeFormat与@JsonFormat不完全解析_第6张图片

@JsonFormat

普通请求

  • 代码
 @JsonFormat(pattern = YYYY_MM_DD_HH_MM_SS)
    private Date birthday;
  • 普通请求报错

@DateTimeFormat与@JsonFormat不完全解析_第7张图片
@DateTimeFormat与@JsonFormat不完全解析_第8张图片

JSON请求

  • 改下controller
   @RequestMapping("/test")
    public User test(@RequestBody User user){
        return user;
    }
  • 测试结果正常
    @DateTimeFormat与@JsonFormat不完全解析_第9张图片
  • 注意:Spring框架默认序列化框架用Jackson,所以你没改序列化框架的话,加了@JsonFormat还具备格式化返回值的能力

其他方式(@InitBinder)

  • 新增一个BaseController,TestController 继承BaseController
public class BaseController {

    /**
     * 将前台传递过来的日期格式的字符串,自动转化为Date类型
     */
    @InitBinder
    public void initBinder(WebDataBinder binder)
    {
        // Date 类型转换
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
        {
            @Override
            public void setAsText(String text)
            {
                setValue(DateUtils.parseDate(text));
            }
        });


    }

}



@RestController
public class TestController extends BaseController {

    @RequestMapping("/test")
    public User test(User user){
        return user;
    }
}

  • 这样它也能获得普通请求接收时间的能力。
    @DateTimeFormat与@JsonFormat不完全解析_第10张图片
  • 不过JSON请求报错。
  • @DateTimeFormat与@JsonFormat不完全解析_第11张图片

@DateTimeFormat与@JsonFormat不完全解析_第12张图片

结论

  • @DateTimeFormat适用于普通请求方式,JSON请求方式报错。
  • @JsonFormat 适用于JSON请求方式,普通请求报错。
  • 注意:Spring框架默认序列化框架用Jackson,所以你没改序列化框架的话,加了@JsonFormat还具备格式化返回值的能力
  • @InitBinder这种方式需要自己写点代码,效果与 @DateTimeFormat雷同,适用于普通请求方式,JSON请求方式报错。

源码地址

  • https://github.com/1030907690/spring-boot-kubernetes/tree/v1.0.3 @DateTimeFormat与@JsonFormat 测试

你可能感兴趣的:(Spring入门及源码分析,java,java,开发语言)