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