唠嗑部分
在做Java开发时,肯定会碰到传递时间参数的情况吧,比如用户的出生日期、活动的开始,结束日期等等,这些参数往往是由前端传递过来的,那么在SpringBoot项目中,该如何正确的接收日期参数呢,这便是我们今日所说的内容
首先我们来回顾一下常用的几种传参方式
1、Params参数
Params参数也称路径传参,参数是路径的一部分,如:http://127.0.0.1:8888/date/receiveParamOfParams/2023-05-22
2、Query参数
Query参数通常使用?进行传递,多个参数使用&分割,如:http://127.0.0.1:8888/date/receiveParamOfQuery?bothDate=2023-05-22
3、请求体参数
请求体参数也是我们常用的json传参
那么为什么要回顾传参方式呢,难道说传参方式不同,接收日期参数的方式也不一样吗?是的没错
言归正传
日期是引用数据类型,在参数传递过程中是无法直接传递引用数据类型的参数的,对于日期时间而言,只能是传递指定格式的时间字符串,由框架帮我们转化为时间类型,对于SpringBoot来说,我们需要了解两个注解
@DateTimeFormat:将前端传递过来的时间格式的字符串转化为Java中的时间格式(引用数据类型)
@JsonFormat:将前端传递过来的时间格式的字符串转化为Java中的时间格式(引用数据类型)、将Java中的时间格式(引用数据类型)以指定的格式转成Json字符串
注意:@JsonFormat注解是由jackson提供的,而@DateTimeFormat注解是由Spring提供的
那下面就让我们分别说一下几种传递方式吧
Params参数
这种参数传递时间比较麻烦,大体思路是首先将时间格式的字符串以字符串传递过来,我们自行转化为时间
@PostMapping("/date/receiveParamOfParams/{date}")
public CommonResult receiveParamOfParams(@PathVariable("date") String date){
CommonResult r = CommonResult.success(null);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
if (StringUtils.hasLength(date)) {
try {
LocalDate localDate = LocalDate.parse(date, formatter);
r.setData(localDate);
} catch (Exception e) {
e.printStackTrace();
}
}
return r;
}
Query参数
如果单个接收的话,也可以根据Params参数一样,先以字符串接收,自己转化为时间即可
在SpringBoot中,如果我们以JavaBean的形式接收Query参数,Spring会自动的映射
@PostMapping("/date/receiveParamOfQuery")
public CommonResult receiveParamOfQuery(DateReq req){
CommonResult r = CommonResult.success(null);
r.setData(req);
return r;
}
DateReq
@Data
public class DateReq {
private LocalDate bothDate;
private LocalDateTime startDateTime;
}
运行结果
注意哈,报错了,意思是不能够将一个字符串解析为LocalDate类型,此时我们需要在字段上加@DateTimeFormat注解
@Data
public class DateReq {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate bothDate;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startDateTime;
}
运行看结果
请求体传参(json传参)
@PostMapping("/date/receiveParamOfJson")
public CommonResult receiveParamOfJson(@RequestBody DateReq req){
CommonResult r = CommonResult.success(null);
r.setData(req);
return r;
}
DateReq实体类如上哈
运行结果
又报错了,SpringBoot默认的json解析器是jackson,它无法将时间字符串解析为时间类型,那么对于json传参而言,@DateTimeFormat注解就失去它的作用了
@Data
public class DateReq {
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate bothDate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startDateTime;
}
运行看结果
换成@JsonFormat注解就可以了,大伙有没有发现,红圈的位置,这个注解也能帮我们格式化时间输出的样式,可对比Query参数输出的结果
结语
1、非Json传参使用@DateTimeFormat,json传参使用@JsonFormat。
2、SpringBoot默认项目中的json解析器是jackson,如果配置的是fastjson,将@JsonFormat换成@JSONField注解即可。
3、制作不易,一键三连再走吧,您的支持永远是我最大的动力!