文章目录

  • 1.@DateTimeFormat注解
    • 1.1@DateTimeFormat注解简介
    • 1.2@DateTimeFormat注解的功能
    • 1.3@DateTimeFormat注解的注意点
    • 1.4@DateTimeFormat功能演示
      • 1.4.1类型转换异常情况测试
      • 1.4.2接收url路径传参格式测试
      • 1.4.3接收Form-Data数据格式测试
      • 1.4.4接收JSON数据格式测试
  • 2.@JsonFormat注解
    • 2.1@JsonFormat注解简介
    • 2.2@JsonFormat注解的功能
    • 2.3@JsonFormat注解的注意点
    • 2.4@JsonFormat功能演示
      • 2.4.1处理前端传递的日期字符串
      • 2.4.2处理查询数据库中的datatime类型格式
  • 3.总结

1.@DateTimeFormat注解

1.1@DateTimeFormat注解简介

@DateTimeFormat注解是由Spring提供的一个注解,位于Spring和核心组件之一的context组件。对应的所需依赖如下:

# SpringBoot对应的依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency># Spring对应的依赖<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency>

双击shift快捷键,全局搜索DateTimeFormat,查看外部库,DateTimeFormat本质上是一个接口

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
public @interface DateTimeFormat {String style() default "SS";ISO iso() default ISO.NONE;String pattern() default "";String[] fallbackPatterns() default {};enum ISO {DATE,TIME,DATE_TIME,NONE}
}

1.2@DateTimeFormat注解的功能

@DateTimeFormat注解的功能是将一个日期字符串转化为对应的Date类型,主要处理前端时间类型与后端pojo对象中的成员变量进行数据绑定,在注解属性patttern中所约束的时间格式并不会影响后端返回前端的时间类型数据格式。。

DateTimeFormat接口的pattern属性:

pattern属性类型为String类型,用于格式化字段或方法参数的自定义模式。默认为空字符串,表示没有指定自定义模式字符串。

当然也可以使用自定义日期模式字符串,如yyyy-MM-dd HH:mm:ss

1.3@DateTimeFormat注解的注意点

  • @DateTimeFormat注解既可以作用于pojo类型的属性上,也可以作用于方法参数上。

  • 前端传入的时间类型的字符串要和pattern属性所规定的规则相同。

  • @DateTimeFormat注解只能处理非JSON数据格式的字符串(如url-String格式、Form-Data格式),如果要处理JSON数据格式,就需要采用@RequestBody注解,@RequestBody就是获取请求体中的内容(即JSON字符串),再通过JSON解析库(如Jackson、FatJosn)将JSON字符串转换为pojo对象。

    ​ 两种JSON解析库所需依赖:

        <!--       fastjson所需依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version></dependency>

​ Jackson由于是Spring提供的,所以它所需的依赖就在Spring依赖中。

  • @DateTimeFormat注解只是解析日期字符串转为Date类型,转换后的日期格式并不会受到@DateTimeFormat注解中pattern属性的约束。

1.4@DateTimeFormat功能演示

1.4.1类型转换异常情况测试

  1. pojo层
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {private String username;private Date birthday;
}
  1. controller层
@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {@GetMapping("/exception")public User dft1(User user){log.info( "用户信息是:" + user);return user;}
}
  1. 用ApiFox进行接口测试,传输的数据格式为url路径传参

请求400,查看控制台日志信息

报错信息:即String类型转换为Date类型失败

Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘birthday’; nested exception is org.springframework.core.convert

1.4.2接收url路径传参格式测试

  1. pojo层
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {private String username;@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date birthday;
}
  1. 用ApiFox进行接口测试,传输的数据格式为url路径传参

​ 查看响应情况和控制台输出情况:可以发现@DateTimeFormat注解对日期字符串进行了解析,转换为对应的Date类型

但是要注意@DateTimeFormat注解只是解析日期字符串转为Date类型,转换后的日期格式并不会受到@DateTimeFormat注解中pattern属性的约束。

​ 响应的JSON字符串数据如下:

1.4.3接收Form-Data数据格式测试

  1. pojo和controller都不变

  2. 用ApiFox进行接口测试,传输的数据格式为Form-Data类型

  3. 测试结果:

    响应的JSON字符串数据如下:

1.4.4接收JSON数据格式测试

​ 接受JSON数据格式时,在接收参数时,通过@RequestBody获取请求体中的内容(即JSON字符串),再通过JSON解析库(如Jackson、FatJosn)将JSON字符串转换为pojo对象

  1. pojo层不变
  2. controller层

​ 通过FastJson处理JSON数据,fastjson默认使用的序列化格式就是:

DEFFAULT_DATE_FORMAT = “yyyy-MM-dd HH:mm:ss”;

@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {@GetMapping("/exception")public User dft1(@RequestBody String userMsg) {JSONObject jsonObject = new JSONObject();User user = JSONObject.parseObject(userMsg, User.class);log.info("用户信息是:" + user);return user;}
}
  1. 用ApiFox进行接口测试,传输的数据格式为JSON类型

  1. 测试结果:

​ 响应的JSON字符串数据如下:

  1. 使用JSON解析库Jackson进行解析JSON数据

  2. controller层

@GetMapping("/exception")
public User dft1(@RequestBody String userMsg) {ObjectMapper objectMapper = new ObjectMapper();User user = null;try {user = objectMapper.readValue(userMsg, User.class);} catch (JsonProcessingException e) {e.printStackTrace();}log.info("用户信息是:" + user);return user;
}
  1. 用ApiFox进行接口测试,传输的数据格式为JSON类型

  1. 测试结果

​ 控制台报错,错误信息提示反序列化失败,因为jackson默认的日期反序列不支持yyyy-MM-dd HH:mm:ss 这种格式,而是默认"yyyy-MM-dd’T’HH:mm:ss.SSSX",所以反序列化失败。

​ 这就引出了今天要介绍的另一个注解@JsonFormat

2.@JsonFormat注解

2.1@JsonFormat注解简介

​ @JsonFormat注解是由Jackson提供的一个注解,位于Jackson的annotation包中,本身也是一个接口

所对应的依赖如下:

<!--Jackson包-->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

​ SpringBoot的web依赖默认内置的有Jackson相应依赖。

2.2@JsonFormat注解的功能

@JsonFormat注解的功能是处理请求中的JSON日期字符串和查询数据库中的日期类型。即可约束时间类型的请求格式和响应格式。

JsonFormat接口的pattern属性:

pattern属性类型为String类型,用于格式化字段或方法参数的自定义模式。默认为空字符串,表示没有指定自定义模式字符串。

当然也可以使用自定义日期模式字符串,如yyyy-MM-dd HH:mm:ss

JsonFormat接口的timezone属性:

东八区([UTC]/[GMT]+08:00)是比[世界协调时间](UTC)/[格林尼治时间](GMT)快8小时的时区,我国就是属于东八区,所以要指定时区为"GMT+8"

2.3@JsonFormat注解的注意点

  • @JsonFormat只能作用在实体类上,不能作用于方法参数上。
  • @JsonFormat会根据pattrn属性约束日期格式,在返回数据时会返回约束日期格式,这点和@DateTimeFormat不同
  • @JsonFormat注解当需要处理前端传来的数据时,先通过@RequestBody将入参参数映射到实体后,@JsonFormat注解才能去对时间格式进行约束;

2.4@JsonFormat功能演示

2.4.1处理前端传递的日期字符串

  1. pojo层
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {private String username;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date birthday;
}
  1. controller层
@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {@GetMapping("/exception")public User dft1(@RequestBody String userMsg) {ObjectMapper objectMapper = new ObjectMapper();User user = null;try {user = objectMapper.readValue(userMsg, User.class);} catch (JsonProcessingException e) {e.printStackTrace();}log.info("用户信息是:" + user);return user;}
}
  1. 测试结果:

​ 响应的JSON字符串数据如下:

​ 可以发现@JsonFormat注解可以根据pattern属性对返回的数据进行约束

2.4.2处理查询数据库中的datatime类型格式

  1. 数据库中的数据格式为datatime类型

  1. 先测试不添加@JsonFormat注解时的情况,发送请求,查询数据库,查看响应的JSON数据

  1. 添加@JsonFormat注解再次进行测试

    ​ 数据格式转换成功

3.总结

  • 当处理的数据格式为非JSON格式(url路径传参、Form-Data)的时候适合使用@DateTimeFormat注解进行处理,就是格式化后的日期格式并不会按照属性pattern中所约束的格式响应,如果想要规定日期格式,可采用SimpleDateFormat对象进行处理。
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = simpleDateFormat.format(user.getBirthday());
System.out.println(date);

  • 当处理的数据格式为JSON数据格式时适合使用@JsonFormat注解进行处理,如果是前端返回的JSON日期字符串,需要使用@RequestBody注解获取请求体中的JSON字符串,再通过JSON解析库将JSON字符串转换为对应的POJO类型。或者是从数据库中查出对应的DateTime类型时对类型进行转换。

@DateTimeFormat和@JsonFormat介绍相关推荐

  1. 时间格式化问题@DateTimeFormat和@JsonFormat的区别

    @DateTimeFormat和@JsonFormat的区别 一.介绍 二.使用 2.1导包 2.2加注解 三.区别和相同点 3.1区别 3.2 相同点 一.介绍 @DateTimeFormat和@J ...

  2. @DateTimeFormat和@JsonFormat的区别

    一.介绍 @DateTimeFormat和@JsonFormat都是处理时间格式化问题的,把其他类型转换成自己需要的时间类型. 二.使用 2.1导包 @DateTimeFormat和@JsonForm ...

  3. @DateTimeFormat与@JsonFormat不完全解析

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

  4. @DateTimeFormat 与 @JsonFormat 的区别

    @DateTimeFormat 与 @JsonFormat 的区别 @JsonFormat 是 jackson 对 json 数据进行格式化, 包含序列化和反序列化. 只与 json 有关. @Dat ...

  5. 时间转换@DateTimeFormat和@JsonFormat

    一:@DateTimeFormat是Spring-context包下的注解. 作用:将前端传过来的String类型转为Date类型. (5条消息) 前台传递一个时间字符传,后台怎么用Date类型接收? ...

  6. 关于@DateTimeFormat 和 @JsonFormat 注解

    两个参数都是针对日期格式化做处理 1.入参格式化@DateTimeFormat 传入参数是 String 类型,接收的参数Date 类型,类型无法转换. 使用 Spring 的 @DateTimeFo ...

  7. Date入参和出参格式_@DateTimeFormat 和 @JsonFormat 注解

    1. 准备 定义一个pojo,它有一个 java.util.Date 类型的属性 date. import java.util.Date;           public class DateVo ...

  8. datetimeformat和jsonformat的区别

    datetimeformat:用于格式化参数,可将date的字符串转化为date对象,即前端向后端发送一个约定好的时间字符串 "yyyy-MM-dd hh:mm:ss" 既然是格式 ...

  9. @JsonFormat @DataTimeFormat 时间格式

    省流:用@JsonFormat即可 一.时间格式 字符串转Date 入参出参dto里,有时候会看到@DateTimeFormat或@JsonFormat,代码如下. public class XXXd ...

最新文章

  1. Kafka 2.8独立运行,不再需要ZooKeeper
  2. Add margining capability to a dc/dc converter
  3. HTC推出新款VR头显,奇怪的是只在日本销售
  4. 2014---努力才是真天赋
  5. Meditation Guide
  6. 添加一个hello wrold系统调用到内核
  7. 从零开始入门 K8s | 应用编排与管理:Job DaemonSet
  8. 什么是document对象?如何获取文档对象上的元素?_dom对象
  9. Bzoj2732 [HNOI2012]射箭
  10. 猎豹java数据结构,猎豹网校C++数据结构与算法42讲视频教程
  11. mysql双机热备份
  12. 20200807-玻璃涨停,隔夜低开,纯碱高开,今天晚上就是空头盛宴,43500了哈哈哈,赚钱了,别做了
  13. 花了一万多买的web前端全套教程,现在分享给大家
  14. table td 调整margin无效
  15. java代码实现打气球游戏_关于javascript和css3开发打气球小游戏的完整代码
  16. Vant Webapp步骤表单
  17. mysql 用户名 长度_一个 MySQL 用户名长度的坑
  18. 两电脑使用网线连接传文件方法
  19. PHP excel导出(自定义样式,行高,合并单元格等)
  20. 软考中项:常考知识点及案例分析要点总结

热门文章

  1. 误入前端三年之番外篇
  2. JAVAP反编译中助记符的含义
  3. Android:如何处理线上crash问题
  4. 计算机基础及ms office应用选择题,计算机一级基础及MSOffice应用部分选择真题
  5. cad管线交叉怎么画_「CAD插件」CAD尺寸距离标注(十六式)_CAD尺寸标注
  6. 世界八个著名游戏工作室
  7. 下拉菜单,汉堡菜单,Mega menu… 学习5种常见UI导航设计
  8. 微信小程序中实现简单Demo(两数之和)
  9. java mysql数据库中文乱码 编码修改教程
  10. 学术论文写作辅助工具