SpringMVC之@InitBinder注解詳解
@InitBinder注解的作用
springmvc并不是能對所有類型的參數(shù)進行綁定的,如果對日期Date類型參數(shù)進行綁定,就會報錯IllegalStateException錯誤。
所以需要注冊一些類型綁定器用于對參數(shù)進行綁定。InitBinder注解就有這個作用。
程序代碼示例:
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.Date; @RestController @RequestMapping("/date") public class InitBinderController { @RequestMapping(value = "/testInitBinder", method = RequestMethod.GET) private String testInitBinder(Date date) { System.out.println("date = " + date); return "RequsetInitBindDemo"; } }
postman測試:
不能把String類型轉(zhuǎn)換為Date類型報錯。
此時就需要一個日期類型轉(zhuǎn)換器。
import org.springframework.format.datetime.DateFormatter; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.Date; @RestController @RequestMapping("/date") public class InitBinderController { @RequestMapping(value = "/testInitBinder", method = RequestMethod.GET) private String testInitBinder(Date date) { System.out.println("date = " + date); return "RequsetInitBindDemo"; } @InitBinder public void dateTypeBinder(WebDataBinder webDataBinder) { //往數(shù)據(jù)綁定器中添加一個DateFormatter日期轉(zhuǎn)化器。 webDataBinder.addCustomFormatter(new DateFormatter("yyyy-mm-dd")); } }
postman測試:
打印結(jié)果:
date = Tue Jan 15 00:05:00 CST 2019
InitBinder注解源碼
@Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface InitBinder { //指定參數(shù)名,這個不知控制器方法上形參的參數(shù)名,而是請求參數(shù)名, //可以指定多個。指定后只有這些參數(shù)需要用到該轉(zhuǎn)換器。如果不指定,默認所有。 String[] value() default {}; }
注意:并且使用InitBinder 注冊的綁定器只有在當(dāng)前Controller中才有效,不會作用于其他Controller。
此時,就需要用到@ControllerAdvice注解定義全局綁定器。使不同controller的方法都能作用到。
import org.springframework.format.datetime.DateFormatter; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder; @ControllerAdvice public class InitConfig { @InitBinder public void dateTypeBinder(WebDataBinder webDataBinder) { //往數(shù)據(jù)綁定器中添加一個DateFormatter日期轉(zhuǎn)化器。 webDataBinder.addCustomFormatter(new DateFormatter("yyyy-mm-dd")); } }
使用其他格式轉(zhuǎn)化器
我們可以自定義格式轉(zhuǎn)化器,實現(xiàn)Formatter接口就可。還可以添加驗證器等等。
public class StringFormatter implements Formatter<String> { private static final String PREFIX = "convertString == "; @Override public String parse(String text, Locale locale) throws ParseException { //所以String類型參數(shù)都加上一個前綴。 String result = PREFIX + text; return result; } @Override public String print(String object, Locale locale) { return object; } }
添加:
import org.springframework.format.datetime.DateFormatter; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder; @ControllerAdvice public class InitConfig { @InitBinder public void dateTypeBinder(WebDataBinder webDataBinder) { //往數(shù)據(jù)綁定器中添加一個DateFormatter日期轉(zhuǎn)化器。 webDataBinder.addCustomFormatter(new DateFormatter("yyyy-mm-dd")); //添加一個string類型的數(shù)據(jù)綁定器,作用是加個前綴 webDataBinder.addCustomFormatter(new StringFormatter()); } }
測試:
@RequestMapping(value = "/testInitBinder2", method = RequestMethod.GET) private String testInitBinder2(String name) { System.out.println("name = " + name); return "RequsetInitBindDemo"; }
打印結(jié)果:
name = convertString == 劉亦菲
到此這篇關(guān)于SpringMVC之@InitBinder注解詳解的文章就介紹到這了,更多相關(guān)@InitBinder注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot快速搭建ftpserver服務(wù)端的詳細步驟
基于springboot,使用ftpserver快速搭建一個FTP服務(wù)端,搭建過程很簡單,我們把過程分成4個步驟,一分鐘內(nèi)快速完成構(gòu)建,感興趣的朋友跟隨小編一起看看吧2023-11-11SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式
這篇文章主要介紹了SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java設(shè)計模式之迭代器模式_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java設(shè)計模式之迭代器模式_動力節(jié)點Java學(xué)院整理,需要的朋友可以參考下2017-08-08