說明與作用
springmvc並不是能對所有類型的參數進行綁定的,如果對日期Date類型參數進行綁定,就會報錯IllegalStateException錯誤。所以需要註冊一些類型綁定器用於對參數進行綁定。InitBinder註解就有這個作用。
@Controller
public class InitBinderController {
@RequestMapping("/testInitBinder")
private String testInitBinder(Date date){
System.out.println("date = " + date);
return "RequsetInitBindDemo";
}
}
不能把String類型轉換爲Date類型報錯。
此時就需要一個日期類型轉換器。
@InitBinder
public void dateTypeBinder(WebDataBinder webDataBinder){
//往數據綁定器中添加一個DateFormatter日期轉化器。
webDataBinder.addCustomFormatter(new DateFormatter("yyyy-mm-dd"));
}
日期類型轉換成功了。
InitBinder註解:
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface InitBinder {
//指定參數名,這個不知控制器方法上形參的參數名,而是請求參數名,可以指定多個。指定後只有這些參數需要用到該轉換器。如果不指定,默認所有。
String[] value() default {};
}
並且使用InitBinder 註冊的綁定器只有在當前Controller中才有效,不會作用於其他Controller。
在其他controller中定義一個接收請求的方法。
請求失敗。
使用@ControllerAdvice定義全局綁定器
可以使用@ControllerAdvice定義全局綁定器。ControllerAdvice的使用可以看文章
@ControllerAdvice
public class InitBinderAdviseController {
@InitBinder
public void dateTypeBinder(WebDataBinder webDataBinder){
//往數據綁定器中添加一個DateFormatter日期轉化器。
webDataBinder.addCustomFormatter(new DateFormatter("yyyy-mm-dd"));
}
}
結果:
不同controller的方法都能作用到。
使用其他格式轉化器
我們可以自定義格式轉化器,實現Formatter接口就可。還可以添加驗證器等等。
public class StringFormatter implements Formatter<String> {
private static final String PREFIX = "convertString == ";
@Override
public String parse(String text, Locale locale) throws ParseException {
//所以String類型參數都加上一個前綴。
String result = PREFIX + text;
return result;
}
@Override
public String print(String object, Locale locale) {
return object;
}
}
添加
測試:
@RequestMapping("/testInitBinder2")
private String testInitBinder1(String name){
System.out.println("name = " + name);
return "RequsetInitBindDemo";
}
結果:
前綴有了。