基于springboot处理date参数过程解析
这篇文章主要介绍了基于springboot处理date参数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
前言
最近在后台开发中遇到了时间参数的坑,就单独把这个问题提出来找时间整理了一下;
正文
测试方法
bean代码:
publicclassDateModelNoAnnotation{ privateIntegerid; privateDatereceiveDate; }
controller代码:
@RestController @RequestMapping("/date") publicclassDateVerifyController{ //方式一 @PostMapping("/no") publicStringdateUnNoAnnotation(DateModelNoAnnotationdateModelNoAnnotation){ System.out.println(dateModelNoAnnotation.toString()); return"SUCCESS"; } //方式二 @PostMapping("/has") publicStringdateHasAnnotation(@RequestBodyDateModelNoAnnotationdateModelNoAnnotation){ System.out.println(dateModelNoAnnotation.toString()); return"SUCCESS"; } //方式三 @GetMapping("/param") publicStringdateParams(@RequestParam("id")Integerid,@RequestParam("receiveDate")DatereceiveDate){ System.out.println("id====="+id); System.out.println("receiveDate====="+receiveDate); System.out.println("receiveDate====="+receiveDate.getTime()); return"SUCCESS"; } //方式四 @GetMapping("/no/param") publicStringdateNoParams(Integerid,DatereceiveDate){ System.out.println("id====="+id); System.out.println("receiveDate====="+receiveDate); System.out.println("receiveDate====="+receiveDate.getTime()); return"SUCCESS"; } }
接收参数的几种方式(实验)
- 通过bean来接收数据(表单方式)
- 这种方式只支持"yyyy/MM/ddHH:mm:ss"这种格式的time参数
- 通过bean来接收数据(json格式)
- 这种方式只支持"yyyy-MM-ddHH:mm:ss"这种格式的time参数
- 通过RequestParam注解
- 这种方式只支持"yyyy/MM/ddHH:mm:ss"这种格式的time参数
- 不通过RequestParam注解
- 这种方式只支持"yyyy/MM/ddHH:mm:ss"这种格式的time参数
以上几种接收参数的方式接收的参数格式并不统一,而且有时候web前端传入的时间参数为时间戳,还得写修改接口或者让其自己修改格式;
后端给前端统一返回json格式的数据,且时间格式为"yyyy-MM-ddHH:mm:ss"
解决方案
开发之前统一时间接口接收的时间格式
一yyyy/MM/ddHH:mm:ss格式
后端所有接口统一接收"yyyy/MM/ddHH:mm:ss"或"yyyy/MM/dd"格式时间参数
第一种:舍弃上边的方式二的接口
第二种:不舍弃方拾二,在bean的时间属性上添加JsonFormat注解,例如:
com.fasterxml.jackson.annotation.JsonFormat; @JsonFormat(timezone="GMT+8",pattern="yyyy/MM/ddHH:mm:ss") privateDatereceiveDate;
优势:不舍弃方式二接口,且统一了时间格式
使用该注解的弊端:当pattern="yyyy/MM/dd"时,只支持处理“2019/09/03"格式时间参数,不支持“2019/09/0300:00:00”,且会报错,当pattern="yyyy/MM/ddHH:mm:ss"时,只支持处理“2019/09/0300:00:00"格式时间参数,其余格式均会报错;
二接收所有时间格式
- yyyy-MM-ddHH:mm:ss格式
- yyyy-MM-dd格式
- 时间戳
- yyyy/MM/ddHH:mm:ss格式
- yyyy/MM/dd格式
注意
该方式不对json或xml的数据处理,比如使用@RequestBody注解的bean(也就是方式二)
工具类:
importorg.springframework.core.convert.converter.Converter; importorg.springframework.util.StringUtils; importjava.text.SimpleDateFormat; importjava.util.Date; /** *@authorgyc *@title:DateConverter *@projectNameapp *@date2019/8/1914:36 *@description:时间转换类 */ publicclassCourseDateConverterimplementsConverter{ privatestaticfinalStringdateFormat="yyyy-MM-ddHH:mm:ss"; privatestaticfinalStringdateFormata="yyyy-MM-ddHH:mm:ss"; privatestaticfinalStringshortDateFormat="yyyy-MM-dd"; privatestaticfinalStringshortDateFormata="yyyy/MM/dd"; privatestaticfinalStringtimeStampFormat="^\\d+$"; @Override publicDateconvert(Stringvalue){ if(StringUtils.isEmpty(value)){ returnnull; } value=value.trim(); try{ if(value.contains("-")){ SimpleDateFormatformatter; if(value.contains(":")){ //yyyy-MM-ddHH:mm:ss格式 formatter=newSimpleDateFormat(dateFormat); }else{ //yyyy-MM-dd格式 formatter=newSimpleDateFormat(shortDateFormat); } returnformatter.parse(value); }elseif(value.matches(timeStampFormat)){ //时间戳 LonglDate=newLong(value); returnnewDate(lDate); }elseif(value.contains("/")){ SimpleDateFormatformatter; if(value.contains(":")){ //yyyy/MM/ddHH:mm:ss格式 formatter=newSimpleDateFormat(dateFormata); }else{ //yyyy/MM/dd格式 formatter=newSimpleDateFormat(shortDateFormata); } returnformatter.parse(value); } }catch(Exceptione){ thrownewRuntimeException(String.format("parser%stoDatefail",value)); } thrownewRuntimeException(String.format("parser%stoDatefail",value)); } }
将时间转换类应用到接口上
介绍两种方式:使用@Component+@PostConstruct或@ControllerAdvice+@InitBinder
第一种方式:
@Component+@PostConstruct
importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.core.convert.support.GenericConversionService; importorg.springframework.stereotype.Component; importorg.springframework.web.bind.support.ConfigurableWebBindingInitializer; importorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; importjavax.annotation.PostConstruct; @Component publicclassWebConfigBeans{ @Autowired privateRequestMappingHandlerAdapterhandlerAdapter; @PostConstruct publicvoidinitEditableAvlidation(){ ConfigurableWebBindingInitializerinitializer=(ConfigurableWebBindingInitializer)handlerAdapter.getWebBindingInitializer(); if(initializer.getConversionService()!=null){ GenericConversionServicegenericConversionService=(GenericConversionService)initializer.getConversionService(); genericConversionService.addConverter(newDateConverterConfig()); } } }
第二种方式:
@ControllerAdvice+@InitBinder
importcom.aegis.config.converter.DateConverter; importcom.aegis.model.bean.common.JsonResult; importorg.springframework.core.convert.support.GenericConversionService; importorg.springframework.http.HttpStatus; importorg.springframework.web.bind.WebDataBinder; importorg.springframework.web.bind.annotation.*; @ControllerAdvice publicclassCourseControllerHandler{ @InitBinder publicvoidinitBinder(WebDataBinderbinder){ GenericConversionServicegenericConversionService=(GenericConversionService)binder.getConversionService(); if(genericConversionService!=null){ genericConversionService.addConverter(newCourseDateConverter()); } } }
最后
我使用的最后的一种方法的第二种方式
总结
时间参数这个坑还是有点大的,之前都是针对性的处理,只要一变化就没法了;现在这个还是可以应付基本上会出现的错误了;
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。