@InitBinder
@Controller
或 @ControllerAdvice
类可以有 @InitBinder
方法来
初始化 WebDataBinder
实例,这些实例反过来可以:
-
将请求参数绑定到模型对象。
-
将请求值从字符串转换为对象属性类型。
-
在渲染 HTML 表单时将模型对象属性格式化为字符串。
在 @Controller
中,DataBinder
的自定义设置在控制器内部局部应用,
甚至通过注解中指定的名称引用到特定的模型属性。
在 @ControllerAdvice
中,自定义设置可以应用于所有控制器或控制器的一个子集。
您可以在 DataBinder
中注册 PropertyEditor
、Converter
和 Formatter
组件,用于类型转换。
或者,您可以使用 MVC 配置 在全局共享的 FormattingConversionService
中注册 Converter
和
Formatter
组件。
@InitBinder
方法可以拥有许多与 @RequestMapping
方法相同的参数,
但 @ModelAttribute
是一个显著的例外。通常,此类方法具有 WebDataBinder
参数(用于注册)
和 void
返回值,例如:
- Java
-
@Controller public class FormController { @InitBinder [id="CO1-1"][id="CO1-1"][id="CO1-1"](1) public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); } // ... }
<1> 定义一个 `@InitBinder` 方法。
- Kotlin
-
@Controller class FormController { @InitBinder [id="CO2-1"][id="CO1-2"][id="CO2-1"](1) fun initBinder(binder: WebDataBinder) { val dateFormat = SimpleDateFormat("yyyy-MM-dd") dateFormat.isLenient = false binder.registerCustomEditor(Date::class.java, CustomDateEditor(dateFormat, false)) } // ... }
<1> 定义一个 `@InitBinder` 方法。
或者,当您通过共享的 FormattingConversionService
使用基于 Formatter
的设置时,
您可以重用相同的方法并注册控制器特定的 Formatter
实现,如以下示例所示:
- Java
-
@Controller public class FormController { @InitBinder [id="CO3-1"][id="CO1-3"][id="CO3-1"](1) protected void initBinder(WebDataBinder binder) { binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); } // ... }
<1> 在自定义格式化器上定义 `@InitBinder` 方法。
- Kotlin
-
@Controller class FormController { @InitBinder [id="CO4-1"][id="CO1-4"][id="CO4-1"](1) protected fun initBinder(binder: WebDataBinder) { binder.addCustomFormatter(DateFormatter("yyyy-MM-dd")) } // ... }
<1> 在自定义格式化器上定义 `@InitBinder` 方法。