@DateTimeFormat与@JsonFormat不完全解析

前言

  • 一直以来对@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参数不成功。

在这里插入图片描述
在这里插入图片描述

  • 取消birthday正常。
    在这里插入图片描述

普通请求

  • 那我们加上@DateTimeFormat看看。
   @DateTimeFormat(pattern = YYYY_MM_DD_HH_MM_SS)
    private Date birthday;
  • 加入之后GET/POST都成功
    在这里插入图片描述

在这里插入图片描述

JSON请求

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

在这里插入图片描述

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

在这里插入图片描述

@JsonFormat

普通请求

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

在这里插入图片描述
在这里插入图片描述

JSON请求

  • 改下controller
   @RequestMapping("/test")
    public User test(@RequestBody User user){
    
    
        return user;
    }
  • 测试结果正常
    在这里插入图片描述
  • 注意: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;
    }
}

  • 这样它也能获得普通请求接收时间的能力。
    在这里插入图片描述
  • 不过JSON请求报错。
  • 在这里插入图片描述

在这里插入图片描述

结论

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

源码地址

猜你喜欢

转载自blog.csdn.net/baidu_19473529/article/details/131330216