Springboot后台接收前端Date类型
From: https://my.oschina.net/zicheng/blog/2963117
這個問題不是專門針對Springboot的,Springmvc也同樣適用于這一個問題。
? ? 昨的是Springboot前后端分離的項目,今天和前端對接口發現前端的請求走不到后臺,檢查了請求什么的都沒有問題,最后發現問題在于后臺處理前端傳過來的時間(Date)問題。
? ? 一般前端提交表單的時候Controller控制器會把表單元素注入到一個command類中,然后發送到后臺,但是前端所能傳遞到后臺的數據類型一般是int、char、String等這些基本數據類型,如果我們需要傳遞一些復雜的數據類型入Integer或者Date這些的時候我們就需要自己去處理了。
? ? 這里我們主要講解如何處理前端傳遞過來的Date類型數據。我們這邊以接受模型為例,下面代碼后臺需要接受前端傳遞過來的時間類型參數startTime(開始時間)和endTime(結束時間),前端數據類型為(2018-11-29 14:48:06)格式數據。
@RequestMapping(value = "/ask",method = RequestMethod.POST)public Result ask(Test test) { public class Test {// 開始時間private Date startTime;// 結束時間private Date endTime;public Date getStartTime() {return startTime;}public void setStartTime(Date startTime) {this.startTime = startTime;}public Date getEndTime() {return endTime;}public void setEndTime(Date endTime) {this.endTime = endTime;} }? ? 這里有三種方式解決這個問題,三種方式解決問題的原理基本相同,我們可以根據具體需求進行選擇。
方法一:
? ? 使用@DatetimeFormat注解加載需要接受Date數據的字段上,在接受前端時間的時候會將時間轉換為我們需要的格式。
public class Test {// 開始時間@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date startTime;// 結束時間@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date endTime;public Date getStartTime() {return startTime;}public void setStartTime(Date startTime) {this.startTime = startTime;}public Date getEndTime() {return endTime;}public void setEndTime(Date endTime) {this.endTime = endTime;} }方法二:
? ? 在對應需要接受Date參數的后臺控制器層添加如下代碼。
????由@InitBinder表示的方法,可以對WebDataBinder對象進行初始化。WebDataBinder是Spring自帶的一個類,通過這個類我們可以將前端傳遞過來的類進行格式轉換。當后臺接受到前端傳遞過來的數據類型的時候會在我們的Test這個類里面進行數據的getter個setter,當set的類型不是基本數據類型的時候,由于在目前控制器層這個類中有者下面一段代碼,于是日期類型的數據會進到下面代碼中進行一次數據轉換,我們這里是將前端的數據類型轉化為了Date類型然后調用Test類中的set方法設置字段。
????dateFormat.setLenient(false);這里的作用是設置是否嚴格解析時間,這里默認是true,我們設為false就是要嚴格解析時間,因為當傳遞過來的時間格式不規范的時候SimpleDateFormat擁有自動計算功能,這時候會自動解析傳遞過來的時間然后顯示規范的格式。
@InitBinder public void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");dateFormat.setLenient(false);//是否嚴格解析時間 false則嚴格解析 true寬松解析binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); }? ? 我們這里不僅僅可以來處理時間類型,還可以來處理其它的數據類型(非基本類型數據)如CustomDateEditor、CustomBooleanEditor、CustomNumberEditor等。
@InitBinder public void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Double.class, new DoubleEditor()); binder.registerCustomEditor(Integer.class, new IntegerEditor()); }方法三:
? ? 第三種方式是在第二種方式的基礎上實現的。同樣適用第二種方法中的代碼,但是不同在與我們不用在每一個控制器類中都實現一個方法二中的代碼,只需要寫一個攔截器出來攔截所有的@RequestMapping注解就好。
? ? 如下代碼我們新建一個類:
@ControllerAdvice public class TimeHandler {@InitBinderpublic void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");dateFormat.setLenient(false);//是否嚴格解析時間 false則嚴格解析 true寬松解析binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));} }? ??@ControllerAdvice注解被@Component注解,也相當于Spring中的一個組件。@ControllerAdvice有控制器增強的作用,它主要用于定義@ExceptionHandler,@InitBinder和@ModelAttribute方法,我們這里只給出了@InitBinder的使用方式。
?
? ? 方法二和方法三各有各的優勢:方法二需要在每一個用到Date類型接收的控制器層創建一個上面的方法,比較麻煩。方法三比較簡單只需要寫一個類即可,但是它會攔截每一個前端過來的請求,這樣在這方面就不如方法二了。具體如果代碼里面只有少數幾個地方用到數據類型轉換可以使用方法二,如果很多地方需要使用則選用方法三。
?
注意:
? ? 在最開始寫這個時間數據類型的時候遇到了一個問題造成了一直接受不到請求如下:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");? ? 區別只在與小時的字母大小寫問題,上面是接受24小時制時間,下面是接受12小時制時間。同樣方法一中也要注意這個問題。
yyyy 代表年 MM 代表月(注意這里要用大寫) dd 代表日 HH/hh 代表時(24小時形式/12小時形式) mm 代表分(這里用小寫表示分鐘)
其中代表月的MM大寫是因為為了和時間的分minute區分開,代表日的字母大小寫是為了區分24小時形式和12小時形式。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Springboot后台接收前端Date类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯2016春招之算法编程解析
- 下一篇: 2017年html5行业报告,云适配发布