【发布时间】: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 验证实现。
任何帮助将不胜感激!
【问题讨论】:
标签: hibernate jpa gradle jakarta-ee hibernate-validator