Java中@DateTimeFormat和@JsonFormat注解介绍
作者:☜阳光
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类型转换异常情况测试
pojo层
@Data @NoArgsConstructor @AllArgsConstructor @ToString public class User { private String username; private Date birthday; }
controller层
@Slf4j @RestController @RequestMapping("/datetimeFormatTest") public class DatetimeFormatTest { @GetMapping("/exception") public User dft1(User user){ log.info( "用户信息是:" + user); return user; } }
用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路径传参格式测试
pojo层
@Data @NoArgsConstructor @AllArgsConstructor @ToString public class User { private String username; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date birthday; }
用ApiFox进行接口测试,传输的数据格式为url路径传参
查看响应情况和控制台输出情况:可以发现@DateTimeFormat
注解对日期字符串进行了解析,转换为对应的Date类型
但是要注意:@DateTimeFormat
注解只是解析日期字符串转为Date类型,转换后的日期格式并不会受到@DateTimeFormat
注解中pattern属性的约束。
响应的JSON字符串数据如下:
1.4.3接收Form-Data数据格式测试
pojo和controller都不变
用ApiFox进行接口测试,传输的数据格式为Form-Data类型
测试结果:
响应的JSON字符串数据如下:
1.4.4接收JSON数据格式测试
接受JSON数据格式时,在接收参数时,通过@RequestBody
获取请求体中的内容(即JSON字符串),再通过JSON解析库(如Jackson、FatJosn)将JSON字符串转换为pojo对象
- pojo层不变
- 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; } }
用ApiFox进行接口测试,传输的数据格式为JSON类型
测试结果:
响应的JSON字符串数据如下:
使用JSON解析库Jackson进行解析JSON数据
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; }
用ApiFox进行接口测试,传输的数据格式为JSON类型
测试结果
控制台报错,错误信息提示反序列化失败,因为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小时的时区,我国就是属于东八区,所以要指定时区为"GTM+8"
2.3@JsonFormat注解的注意点
- @JsonFormat只能作用在实体类上,不能作用于方法参数上。
- @JsonFormat会根据pattrn属性约束日期格式,在返回数据时会返回约束日期格式,这点和@DateTimeFormat不同
- @JsonFormat注解需要先通过@RequestBody将入参参数映射到实体后,@JsonFormat注解才能去对时间格式进行约束;
2.4@JsonFormat功能演示
pojo层
@Data @NoArgsConstructor @AllArgsConstructor @ToString public class User { private String username; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GTM+8") private Date birthday; }
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; } }
测试结果:
响应的JSON字符串数据如下:
可以发现@JsonFormat注解可以根据pattern属性对返回的数据进行约束
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
注解进行处理,在这之前需要使用@RequestBody
注解获取请求体中的JSON字符串,再通过JSON解析库将JSON字符串转换为对应的POJO类型。或者是从数据库中查出对应的DateTime类型时对类型进行转换。
到此这篇关于Java中@DateTimeFormat和@JsonFormat注解介绍的文章就介绍到这了,更多相关@DateTimeFormat和@JsonFormat注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!