loading...
InitBinder注解
Published in:2022-01-31 | category: Spring
Words: 441 | Reading time: 1min | reading:

SpringMVC — @InitBinder Date类型转换

​ 这个注解被解析的时机,是匹配Controller的请求执行映射方法之前;同时@InitBinder标注的方法是执行多次的,每请求一次就执行一次。

​ 当某个Controller上的第一次请求由SpringMvc前端控制器匹配到该Controller之后,根据Controller的class类型查找所有方法上标注了@InitBinder的方法,并且存入RequestMappingHandlerAdapter的 initBinderCache,下次请求执行对应业务方法之前时,可以走initBinderCache缓存,而不用再去解析@InitBinder;所以initBinder时Controller级别的,一个Controller实例中所有@initBinder只对该Controller有效。

功能

注册Controller级别的MVC属性编辑器

属性编辑器的功能就是将Web请求中的属性转成我们需要的类型。

​ @initBinder唯一的一个属性value,作用是限制对那些@RequestMapping方法起作用,具体筛选的条件就是通过@RequestMapping方法入参来筛选,默认不写,就代表对所有的@RequestMapping的方法起作用。

@InitBinder标注的方法, 方法入参和 @RequestMapping方法入参可选范围一样(这里指的是比如HttpServletRequestModelMap这些), 通常一个入参 WebDataBinder 就够我们使用了; @InitBinder标注的方法返回值, 必须为null,这里我理解的是运行期的返回值;如果运行时返回值不为null,抛出异常 “@InitBinder methods should return void:”,编译时IDEA会提示@InitBinder应该返回null,但是不影响编译通过;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@InitBinder
public void initBinder(WebDataBinder binder)
{
// Date 类型转换
binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
{
@Override
public void setAsText(String text){
if (text == null) {
return null;
}
try {
Date date = parseDate(text.toString(), parsePatterns);
setValue(date);
} catch (ParseException e) {
System.out.println("转换出错");
}

}
});
}

上面是一个@InitBinder的简单用法 。

Prev:
PostConstruct注解
Next:
SpringBoot整合Shiro
catalog
catalog