@InitBinder

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

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

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

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

@Controller 中,DataBinder 的自定义设置在控制器内部局部应用, 甚至通过注解中指定的名称引用到特定的模型属性。 在 @ControllerAdvice 中,自定义设置可以应用于所有控制器或控制器的一个子集。 您可以在 DataBinder 中注册 PropertyEditorConverterFormatter 组件,用于类型转换。 或者,您可以使用 MVC 配置 在全局共享的 FormattingConversionService 中注册 ConverterFormatter 组件。 @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` 方法。

模型设计

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