问题描述
我遇到一个问题,当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)。
我想我打算用SessionFactoryOptions
或ConfigurationService
做某事,但是我不知道如何在Spring Boot中进行配置。
如何让Hibernate使用LocalValidatorfactorybean实例?
解决方法
技巧是使用HibernatePropertiesCustomizer
指定要使用的验证工厂。像这样:
@Bean
open fun hibernatePropertiesCustomizer(validator: Validator): HibernatePropertiesCustomizer {
return HibernatePropertiesCustomizer { properties: MutableMap<String,Any> -> properties["javax.persistence.validation.factory"] = validator }
}