SpringMVC之@InitBinder處理請求參數的綁定(一)

 Spring請求參數綁定流程 1.請求參數綁定流程 我們在開發的時候,經常會從html,jsp中將請求參數通過request對象傳遞到後臺。可是經常會遇到這麼一種情況,那就是傳過來的數據到後臺後,還要再組裝成一種對象的格式。這時候Spring提供的@InitBinder註解就發揮了很大的作用。

2.Spring中請求參數綁定 Spring可以自動將request中的請求參數數據綁定到對象的每個property上,但是隻會綁定一些簡單數據類型(比如Strings, int, float等)到對應的對象中。可是如果面對複雜的對象,那就要藉助PropertyEditor 來幫助我們完成複雜對象的綁定。 PropertyEditor這個接口提供了兩個方法,一個是方法是將String類型的值轉成property對應的數據類型,另一個方法是將一個property轉成String。

3.CustomDateEditor繼承關係

4.示例代碼 @InitBinder public void InitBinder(WebDataBinder binder) { //前端傳入的時間格式必須是"yyyy-MM-dd"效果! DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); CustomDateEditor dateEditor = new CustomDateEditor(df, true); binder.registerCustomEditor(Date.class, dateEditor); } 二.@InitBinder詳解 1.@InitBinder註解簡介 @InitBinder作用於@Controller中的方法,表示爲當前控制器註冊一個屬性編輯器,對WebDataBinder進行初始化,且只對當前的Controller有效。 2. @InitBinder執行時機 @InitBinder註解被解析的時機,是其所標註的方法,在該方法被請求執行之前。同時@InitBinder標註的方法是可以多次執行的,也就是說來一次請求就執行一次@InitBinder解析。 3. @InitBinder執行原理 當某個Controller上的第一次請求,由SpringMVC前端控制器匹配到該Controller之後,根據Controller的 class 類型來查找所有標註了@InitBinder註解的方法,並且存入RequestMappingHandlerAdapter裏的 initBinderCache 緩存中。等下一次請求執行對應業務方法之前,會先走initBinderCache緩存,而不用再去解析@InitBinder。 三. @InitBinder實現過程 我們先創建一個web程序,過程請參考之前的案例,過程略! 項目結構圖:

1. 創建Controller測試接口 package com.yyg.boot.web; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.beans.propertyeditors.StringTrimmerEditor; import org.springframework.stereotype.Component; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.support.WebBindingInitializer; import org.springframework.web.context.request.WebRequest; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * @Description Description * @Author 一一哥Sun * @Date Created in 2020/3/23 */ @Slf4j @RestController public class BindController { @GetMapping(value = "/bind") public Map<String, Object> getFormatData(Date date) throws ParseException { log.warn("date={}", date); Map<String, Object> map = new HashMap<>(); map.put("name", "一一哥"); map.put("age", 30); map.put("date", date); return map; } } 2. 啓動程序進行測試 此時我們在postman中輸入地址: http://localhost:8080/bind?date=2020-09-09

 經過測試,發現此時產生400狀態碼,具體原因是無法將前端傳遞過來的String類型的時間字符串轉換爲Date類型!

3. 添加@InitBinder代碼,重新測試 我們在上面創建的Controller裏面,添加一段新的代碼,如下: /** * @InitBinder標註的方法,只針對當前Controller有效! * 如果沒有該方法,則會產生400狀態碼! * MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date! */ @InitBinder public void InitBinder(WebDataBinder binder) { //前端傳入的時間格式必須是"yyyy-MM-dd"效果! DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); CustomDateEditor dateEditor = new CustomDateEditor(df, true); binder.registerCustomEditor(Date.class, dateEditor); }

然後我們在postman中重新輸入地址: http://localhost:8080/bind?date=2020-09-09

可以發現前端傳遞的時間字符串被成功的傳遞到後端,並且轉換成了Date類型! 以上就是@InitBinder的原理及用法! 注意: @InitBinder屬於Controller級別的SpringMVC屬性編輯器,並不是全局級別(針對所有@Controller)的屬性編輯器哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章