javax.validation.ValidationException: 无法找到默认的提供程序

32

我目前正在开发一个Spring MVC Web应用程序,并尝试使用@Valid注释来进行验证。当我启动应用程序时,我遇到了以下异常:

javax.validation.ValidationException: Unable to find a default provider

我在类路径上有Hibernate Validator 3.1.0.GA,javax validation 1.0.0.GA,Hibernate Core 3.3.1.GA和Hibernate Annotations 3.4.0.GA。

这些版本之间是否存在不兼容性,导致我仍然会遇到使用Hibernate Validator时出现异常的情况?

谢谢,

Caps


可能是重复的问题:Spring MVC 3 Validation - Unable to find a default provider - Frank van Puffelen
6个回答

37

请参考此答案:https://dev59.com/rXE95IYBdhLWcg3wn_Rr#3989936

要解决问题,请添加此 Maven 依赖项:Hibernate Validator Annotation Processor

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator-annotation-processor</artifactId>
  <version>4.1.0.Final</version>
</dependency>

那是该工件的最新稳定版本,可从这里看到。


查找依赖项的通用方式

假设您收到一个 NoClassDefFoundError 错误,指出未找到类org.postgresql.Driver

  1. 使用 Jarvana 搜索可以提供 org.postgresql.Driver 的依赖关系,如下所示:http://www.jarvana.com/jarvana/search?搜索类型=类&java_class=org.postgresql.Driver,会得到下图: enter image description here

  2. 将上述依赖项转换为 Maven 依赖项格式:

    <dependency>
        <groupId>postgresql</groupId>
       <artifactId>postgresql</artifactId>
       <version>9.1-901.jdbc4</version>
     </dependency>
    
  3. 搜索以下内容以确认其在Maven Central上可用,例如 this:
    g:"postgresql" AND a:"postgresql"
    (其中g表示GroupID,a表示artifactID)

  4. 最后,在您的pom.xml中添加它


使用m2e查找依赖项

如果您大致了解所需的依赖项或可以根据列表确定所需的依赖项,则m2e的依赖项搜索可能是向pom.xml添加依赖项的最快方法。

步骤:

  1. 单击pom.xml中的Dependencies选项卡(A)
  2. 单击添加(B)
  3. 按groupId/artifactId(C)搜索依赖项
  4. 从搜索结果中双击所需的结果以直接将其添加到pom.xml中(D)

如下快照图中的A-D:

enter image description here

在IntelliJ Idea中查找依赖项

在IntelliJ中,查找依赖项要简单得多。您需要做的就是确保IntelliJ已经索引了Maven Central存储库,如下所示:

enter image description here

然后,进入pom.xml,按下dep+Tab(或按下Alt+Insert,如此处所示),就会出现以下内容:

enter image description here

如果您在未解决的导入中,则快速修复选项会为您提供搜索并添加相应的Maven repo的选项,方法是在缺失的类/包上执行Alt+Enterenter image description here

太棒了!



当我添加依赖项后,我的javax.validation.ValidationException:无法找到默认提供程序消失了,但是接下来会出现以下异常:java.lang.ClassNotFoundException:org.postgresql.Driver。 - Ben
@JustmemyselfandI,我认为在将近4个月后你可能不需要它了,但我已经更新了我的答案,提供了一种通用的查找依赖项的方法。 - Ashutosh Jindal

27

Hibernate Validator 3.1不是JSR303的提供者。您需要升级到Hibernate Validator 4或更高版本。


24

没有使用Hibernate,我也遇到了同样的问题。

在我的电脑上可以正常运行,但在我的EC2 Linux服务器上无法工作。

原因是/usr/share/tomcat/lib目录下存在validation-api-1.0.0.GA.jar文件。

一旦删除validation-api-1.0.0.GA.jar文件,它就可以正常工作。


我遇到了同样的问题,你的答案解决了我的问题,但我又遇到了一个错误,我的jersey web方法不起作用,我收到了错误信息。在删除validation-api之前,它可以很好地工作。请问我应该使用什么来替代validation api,请帮助我解决这个问题。 - Sujithrao

2
在我的情况下,我曾经遇到过同样的问题,但是这是因为 Maven 下载的 hibernate-core 4.1.8.Final 版本的 jar 包已损坏。我切换到了版本为 4.1.6.Final 的 jar 包后它开始正常工作了。我当时使用的是 STS 和 Spring 仓库。
希望这能帮助到某些人。

0
我收到了以下错误:
Invocation of init method failed; nested exception is javax.validation.ValidationException: Unable to get available provider resolvers
我发现在我的WEB-INF/lib目录下,有两个 Validator.class 版本都存在于以下两个jar文件中:
  • org.springframework.context-3.1.1.RELEASE.jar
  • com.springsource.javax.validation-1.0.0.GA.jar

我从WEB-INF/lib目录中删除了com.springsource.javax.validation-1.0.0.GA.jar,因为它已经过时且不再受支持。这样做后,我的应用程序完美地工作了。我从其他帖子中了解到,我的问题与类路径上相同文件的重复版本有关。在阅读了Spring 3 Validation之后,我找出了引起问题的文件。


0
在同样的情况下,我只更新了我的Jar版本,从hibernate-anotation和hibernate-common-annotation的注释到Hibernate4的注释,如下所列。 对于Hibernate 4,您可以使用以下Jars-
1-hibernate-commons-annotations-4.0.5.Final 2-hibernate-validator-4.2.0.Final
希望这对您也有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接