@Controller
或 @ControllerAdvice
类可以有 @InitBinder
方法来初始化 WebDataBinder 的实例,而这些实例又可以。
- 将请求参数(即表单或查询数据)绑定到一个模型对象。
- 将基于字符串的请求值(如请求参数、路径变量、headers、cookies 等)转换为控制器方法参数的目标类型。
- 在渲染 HTML 表单时将模型对象的值格式化为字符串值。
@InitBinder
方法可以注册控制器特定的 java.beans.PropertyEditor
或 Spring Converter 和 Formatter 组件。此外,你可以使用 MVC 配置 在一个全局共享的 FormattingConversionService 中注册转换器和格式化器类型。
@InitBinder
方法支持许多与 @RequestMapping
方法相同的参数,除了 @ModelAttribute
(命令对象)的参数。通常,它们被声明时有一个 WebDataBinder 参数(用于注册)和一个无效返回值。下面的列表显示了一个例子:
@Controller
public class FormController {
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
// ...
}
另外,当你通过共享的 FormattingConversionService 使用基于 Formatter 的设置时,你可以重新使用同样的方法并注册控制器特定的Formatter实现,正如下面的例子所示:
@Controller
public class FormController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
// 共享指的是内置的支持,只需要传递一个格式化字符串就可以了
// org.springframework.format.datetime.DateFormatter
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
// ...
}
例子
@InitBinder // 定义一个日期格式化
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
dateFormat.setLenient(false);
// 指定具体对象,需要进行使用这里的格式化
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
@GetMapping("/date")
@ResponseBody
public String fun2(Date date) { // 这里接受一个日期对象,这里就会使用上面定义的 initBinder 进行处理
System.out.println(date);
return "success";
}
:::tips 需要注意的是:@InitBinder 只对当前的 controller 中的方法入参进入处理,另外的 controller 不会生效 :::