休眠验证不使用 Spring Boot LocalValidatorFactoryBean

Posted

技术标签:

【中文标题】休眠验证不使用 Spring Boot LocalValidatorFactoryBean【英文标题】:Hibernate Validation not using Spring Boot LocalValidatorFactoryBean 【发布时间】:2020-12-16 08:37:24 【问题描述】:

我遇到了一个问题,当 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 实例?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于休眠验证不使用 Spring Boot LocalValidatorFactoryBean的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Jpa:默认休眠?

使用 spring-boot 和 spring-data 全局启用休眠过滤器

Spring Boot 2.0.2.RELEASE 的模型验证异常

字符串数据,右截断 - 使用 Spring Boot 进行休眠

使用 Spring Boot 对 mongoDB 进行身份验证失败

Spring Boot:休眠配置