我有 5 个 Controller ,我想为所有 Controller 注册一个 InitBinder
。
我知道我可以将此代码添加到每个代码中。
@InitBinder
public void initBinder(WebDataBinder binder)
{
binder.registerCustomEditor(StringWrapper.class, new StringWrapperEditor());
}
但是我只想定义它一次(甚至创建一个StringWrapperEditor
的bean并使用它而不是每次都创建新的。 )
我搜索了SO和其他一些地方,但没有找到任何答案。 这可能吗?
我使用 spring 3.1.1 和 java 1.6。
最佳答案
虽然最初的问题是关于 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 执行该工作,但缺少设置 Validator。因此,用 @Validated 注释的其余 Controller 参数的验证不起作用:
@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
...
关于java - spring mvc 为所有 Controller 提供一个初始化绑定(bind)器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21165135/