SpringMVC之@InitBinder注解詳解
@InitBinder注解的作用
springmvc并不是能對(duì)所有類型的參數(shù)進(jìn)行綁定的,如果對(duì)日期Date類型參數(shù)進(jìn)行綁定,就會(huì)報(bào)錯(cuò)IllegalStateException錯(cuò)誤。
所以需要注冊(cè)一些類型綁定器用于對(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類型轉(zhuǎn)換為Date類型報(bào)錯(cuò)。
此時(shí)就需要一個(gè)日期類型轉(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類型參數(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類型的數(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)文章
springboot快速搭建ftpserver服務(wù)端的詳細(xì)步驟
基于springboot,使用ftpserver快速搭建一個(gè)FTP服務(wù)端,搭建過程很簡單,我們把過程分成4個(gè)步驟,一分鐘內(nèi)快速完成構(gòu)建,感興趣的朋友跟隨小編一起看看吧2023-11-11
SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式
這篇文章主要介紹了SpringMVC @RequestBody Date類型的Json轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java設(shè)計(jì)模式之迭代器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java設(shè)計(jì)模式之迭代器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-08-08

