【问题标题】:Hibernate Validation not using Spring Boot LocalValidatorFactoryBean休眠验证不使用 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 实例?

【问题讨论】:

    标签: java spring-boot hibernate kotlin hibernate-validator


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      • 1970-01-01
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多