DataBinder

@Controller@ControllerAdvice类可以有 @InitBinder方法来初始化 WebDataBinder 的实例,而这些实例又可以。

  • 将请求参数(即表单或查询数据)绑定到一个模型对象。
  • 将基于字符串的请求值(如请求参数、路径变量、headers、cookies 等)转换为控制器方法参数的目标类型。
  • 在渲染 HTML 表单时将模型对象的值格式化为字符串值。

@InitBinder方法可以注册控制器特定的 java.beans.PropertyEditor或 Spring Converter 和 Formatter 组件。此外,你可以使用 MVC 配置 在一个全局共享的 FormattingConversionService 中注册转换器和格式化器类型。

@InitBinder方法支持许多与 @RequestMapping方法相同的参数,除了 @ModelAttribute(命令对象)的参数。通常,它们被声明时有一个 WebDataBinder 参数(用于注册)和一个无效返回值。下面的列表显示了一个例子:

  1. @Controller
  2. public class FormController {
  3. @InitBinder
  4. public void initBinder(WebDataBinder binder) {
  5. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  6. dateFormat.setLenient(false);
  7. binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
  8. }
  9. // ...
  10. }

另外,当你通过共享的 FormattingConversionService 使用基于 Formatter 的设置时,你可以重新使用同样的方法并注册控制器特定的Formatter实现,正如下面的例子所示:

  1. @Controller
  2. public class FormController {
  3. @InitBinder
  4. protected void initBinder(WebDataBinder binder) {
  5. // 共享指的是内置的支持,只需要传递一个格式化字符串就可以了
  6. // org.springframework.format.datetime.DateFormatter
  7. binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
  8. }
  9. // ...
  10. }

例子

  1. @InitBinder // 定义一个日期格式化
  2. public void initBinder(WebDataBinder binder) {
  3. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
  4. dateFormat.setLenient(false);
  5. // 指定具体对象,需要进行使用这里的格式化
  6. binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
  7. }
  8. @GetMapping("/date")
  9. @ResponseBody
  10. public String fun2(Date date) { // 这里接受一个日期对象,这里就会使用上面定义的 initBinder 进行处理
  11. System.out.println(date);
  12. return "success";
  13. }

:::tips 需要注意的是:@InitBinder 只对当前的 controller 中的方法入参进入处理,另外的 controller 不会生效 :::