DataBinder

@Controller@ControllerAdvice 类可以包含 @InitBinder 方法,用于初始化 WebDataBinder 实例,这些实例反过来可以:

  • 将请求参数绑定到模型对象。

  • 将请求值从字符串类型转换为对象属性类型。

  • 在渲染 HTML 表单时,将模型对象属性格式化为字符串。

@Controller 中,DataBinder 的自定义仅适用于控制器内部,甚至可以通过注解中按名称引用的特定模型属性。在 @ControllerAdvice 中,自定义可以应用于所有控制器或部分控制器。您可以在 DataBinder 中注册 PropertyEditorConverterFormatter 组件以进行类型转换。或者,您可以使用 WebFlux 配置 在全局共享的 FormattingConversionService 中注册 ConverterFormatter 组件。

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`)。

模型设计

Unresolved directive in ann-initbinder.adoc - include::partial$web/web-data-binding-model-design.adoc[]