休眠验证不使用 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)。
我想我打算用 SessionFactoryOptions
或 ConfigurationService
做点什么,但我不知道如何在 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 和 spring-data 全局启用休眠过滤器
Spring Boot 2.0.2.RELEASE 的模型验证异常
字符串数据,右截断 - 使用 Spring Boot 进行休眠