目录
- 前言
- 测试代码
- @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
参数不成功。
- 取消
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请求方式报错。
源码地址
- https://github.com/1030907690/spring-boot-kubernetes/tree/v1.0.3 @DateTimeFormat与@JsonFormat 测试