尽管最初的问题是关于 Spring 3.1,但以下问题可能对那些使用较新 Spring 版本的人有用。
例如,一种可能的选择是将@InitBinder 移动到@ControllerAdvice
@ControllerAdvice
class InitBinderControllerAdvice {
@InitBinder
fun initBinder(dataBinder: WebDataBinder) {
dataBinder.registerCustomEditor(
MLQueryOutputFormat::class.java,
StringToMLQueryOutputFormat()
)
dataBinder.registerCustomEditor(
IDatabaseOps.SortDirection::class.java,
StringToSortDirection()
)
}
}
关于ConfigurableWebBindingInitializer,虽然是个很厉害的东西,但是在验证等方面需要额外的配置,所以实现的时候要注意细节。例如,以下代码按照 InitBinder 执行该工作,但缺少设置验证器。结果,使用 @Validated 注释的其余控制器参数的验证不起作用:
@Configuration
class WebMvcConfig {
@Bean
fun configurableWebBindingInitializer(): ConfigurableWebBindingInitializer {
val initializer = ConfigurableWebBindingInitializer()
initializer.propertyEditorRegistrars = arrayOf(
PropertyEditorRegistrar {
it.registerCustomEditor(
MLQueryOutputFormat::class.java,
StringToMLQueryOutputFormat()
)
}, PropertyEditorRegistrar {
it.registerCustomEditor(
IDatabaseOps.SortDirection::class.java,
StringToSortDirection()
)
}
)
return initializer
}
}
要添加验证,可以执行以下操作:
@Bean
fun configurableWebBindingInitializer(
@Qualifier("defaultValidator") validator: Validator
): ConfigurableWebBindingInitializer {
val initializer = ConfigurableWebBindingInitializer()
initializer.validator = validator
...