使用 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

bean validator - Hibernate validator

Hibernate Validator 使用详解