DataBinder
@Controller
或 @ControllerAdvice
类可以包含 @InitBinder
方法,用于初始化 WebDataBinder
实例,这些实例反过来可以:
-
将请求参数绑定到模型对象。
-
将请求值从字符串类型转换为对象属性类型。
-
在渲染 HTML 表单时,将模型对象属性格式化为字符串。
在 @Controller
中,DataBinder
的自定义仅适用于控制器内部,甚至可以通过注解中按名称引用的特定模型属性。在 @ControllerAdvice
中,自定义可以应用于所有控制器或部分控制器。您可以在 DataBinder
中注册 PropertyEditor
、Converter
和 Formatter
组件以进行类型转换。或者,您可以使用 WebFlux 配置 在全局共享的 FormattingConversionService
中注册 Converter
和 Formatter
组件。
- 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 protected void initBinder(WebDataBinder binder) { binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); [id="CO3-1"]1 } // ... }
<1> 添加自定义格式化器(本例中为 `DateFormatter`)。
- Kotlin
-
@Controller class FormController { @InitBinder fun initBinder(binder: WebDataBinder) { binder.addCustomFormatter(DateFormatter("yyyy-MM-dd")) [id="CO4-1"][id="CO1-3"][id="CO4-1"](1) } // ... }
<1> 添加自定义格式化器(本例中为 `DateFormatter`)。