使用 Hibernate Validator 进行实体验证的问题
Posted
技术标签:
【中文标题】使用 Hibernate Validator 进行实体验证的问题【英文标题】:Problems with Entity validation with Hibernate Validator 【发布时间】:2021-09-14 11:37:27 【问题描述】:我尝试通过 Hibernate Validator 激活自动实体验证。因此,我在我的 Gradle 构建文件中添加了以下依赖项:
implementation 'org.hibernate.validator:hibernate-validator:7.0.1.Final'
implementation 'org.hibernate.validator:hibernate-validator-cdi:7.0.1.Final'
implementation 'org.hibernate.validator:hibernate-validator-annotation-processor:7.0.1.Final'
implementation 'org.glassfish:jakarta.el:4.0.1'
启动我的应用程序时,在构建会话工厂时,抛出以下错误:
java.lang.ClassNotFoundException: javax.validation.ValidatorFactory
我能够通过 Hibernate 实现准确地调试自己到异常的来源。由于我使用的是 Hibernate Validator 的最新实现,因此我知道命名空间已从 javax.*
移动到 jakarta.*
。但是,BeanValidationIntegrator.java
中的这段代码似乎加载了一个依赖于来自javax.*
的一些旧(?)验证包的类:
// see if the Bean Validation API is available on the classpath
if ( isBeanValidationApiAvailable( classLoaderService ) )
// and if so, call out to the TypeSafeActivator
try
final Class typeSafeActivatorClass = loadTypeSafeActivatorClass( classLoaderService );
@SuppressWarnings("unchecked")
final Method activateMethod = typeSafeActivatorClass.getMethod( ACTIVATE_METHOD_NAME, ActivationContext.class );
我能够让我的 IDE 向我显示加载的 typeSafeActivatorClass
的源代码,并看到它确实依赖于 javax.validation.*
。
所以我将所需的依赖项添加到我的构建文件 (javax.validation:validation-api:2.0.1.Final
) 并测试验证现在是否可以工作,我将以下属性添加到我的 Hibernate 配置中:
jakarta.persistence.validation.mode=callback
很遗憾,我收到一个错误,指出没有可用的 bean 验证实现。
任何帮助将不胜感激!
【问题讨论】:
【参考方案1】:正如您在release announcement of Hibernate 5.5.0 中所读到的,您必须使用带有-jakarta
工件ID 后缀的休眠工件。看来你没有这样做。
【讨论】:
以上是关于使用 Hibernate Validator 进行实体验证的问题的主要内容,如果未能解决你的问题,请参考以下文章
Java后端校验-使用hibernate-validator校验JavaBean
使用 Hibernate Validator (JSR 303) 进行跨字段验证
SpringBoot项目使用Hibernate Validator进行表单验证
在Spring中使用数据验证组件hibernate-validator