不使用Spring Boot LocalValidatorFactoryBean进行休眠验证

问题描述

我遇到一个问题,当spring.jpa.properties.javax.persistence.validation.mode设置为auto认)时,它将尝试验证我的实体,这很棒。但是,我有一些自定义的ConstraintValidator,它们依赖于通过构造函数自动关联到它们的依赖项。结果我得到了错误

Caused by: javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: project.CustomValidator.

这是因为:

Caused by: java.lang.NoSuchMethodException: project.CustomValidator.<init>()

由于我的依赖项是通过构造函数注入的,因此没有0 arity构造函数

当我像这样创建Spring Boot的配置时:

@Configuration
open class ValidationContext {
    @Bean
    open fun validator(): Validator {
        return LocalValidatorfactorybean()
    }
}

Spring Boot验证器工厂工作正常,并且没有实例化我的自定义ConstraintValidator的问题。但是,Hibernate不使用该工厂。而是调用Validation.buildDefaultValidatorFactory()(请参阅code)。

我想我打算用SessionFactoryOptionsConfigurationService做某事,但是我不知道如何在Spring Boot中进行配置。

如何让Hibernate使用LocalValidatorfactorybean实例?

解决方法

技巧是使用HibernatePropertiesCustomizer指定要使用的验证工厂。像这样:

@Bean
open fun hibernatePropertiesCustomizer(validator: Validator): HibernatePropertiesCustomizer {
    return HibernatePropertiesCustomizer { properties: MutableMap<String,Any> -> properties["javax.persistence.validation.factory"] = validator }
}