java - spring mvc 为所有 Controller 提供一个初始化绑定(bind)器

标签 java spring spring-mvc spring-mvc-initbinders

我有 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/

相关文章:

java - JXTable 中非常不寻常的单元格突出显示

java - 对打印方法进行单元测试

java - 将 JUnitCore 与 Spring 结合使用

Spring Data REST 返回 EmptyCollectionEmbeddedWrapper 而不是空集合

java - spring-boot 项目给出 "Application run failed"错误

java - '没有主要 list 属性'Gradle没有创建 list 文件夹和文件?

java - 堆内存如何工作的说明(Java)

java - Spring-MVC : Failed to import bean definitions from relative location [servlet-context. xml]

java - 如果出现任何类型的异常,重定向到错误 Controller ?

java - spring-mvc 应用程序的模板和布局