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