【问题标题】:javax.validation.ValidationException: Unable to find a default providerjavax.validation.ValidationException:找不到默认提供程序
【发布时间】:2011-10-14 23:05:42
【问题描述】:

我向托管 bean 添加了一些验证 (@NotNull) 并突然收到此错误。任何想法可能导致它?该应用程序在 Apache Tomcat 7 中运行。

javax.validation.ValidationException: Unable to find a default provider
javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:264)
javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:111)
javax.faces.validator.BeanValidator.validate(BeanValidator.java:271)
javax.faces.component.UIInput.validateValue(UIInput.java:1127)
javax.faces.component.UIInput.validate(UIInput.java:941)
javax.faces.component.UIInput.executeValidate(UIInput.java:1189)
javax.faces.component.UIInput.processValidators(UIInput.java:691)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080)
javax.faces.component.UIForm.processValidators(UIForm.java:243)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080)
javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1080)
javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1180)
com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)

【问题讨论】:

标签: java jsf tomcat bean-validation


【解决方案1】:

在应用程序服务器中您的应用程序的类路径中似乎没有 JSR 303 Bean Validation 提供程序。如果您使用的是 Glassfish,最好能验证 $GLASSFISH_INSTALL_ROOT/glassfish/modules 目录中是否存在 bean-validator.jar; Glassfish 3.1 使用这个 JAR(其中包含 Hibernate Validator 实现)作为默认的 JSR 303 Bean Validation 提供程序。我怀疑您使用的是旧版本的 Glassfish,或其他不包含 Bean 验证提供程序的应用程序服务器。

如果您必须在类路径中包含 Bean 验证提供程序,请考虑阅读 ValidationProviderResolver interface 的 Java API 文档,其中指出:

Bean Validation 提供程序由 META-INF/services/javax.validation.spi.ValidationProvider 文件 遵循here 描述的服务提供者模式

每个 META-INF/services/javax.validation.spi.ValidationProvider 文件 包含每个 ValidationProvider 实现的列表 代表提供者。

因此,如果您确实在类路径中手动包含 Bean 验证提供程序,则必须确保在类路径中存在 META-INF/services/javax.validation.spi.ValidationProvider 文件,并且该文件还包含 Bean 验证提供程序的名称。 Glassfish 提供的内容如下,指向 Hibernate Bean Validator 类:

org.hibernate.validator.HibernateValidator

【讨论】:

  • 这让我很困惑。我终于弄清楚是API的提供者负责将映射文件包含在META-INF中,而不是客户端。
  • 有人可以提供适当的解决方案吗?
猜你喜欢
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
  • 2016-04-23
  • 2011-01-14
  • 1970-01-01
  • 2023-03-29
  • 2014-02-28
  • 2012-08-21
相关资源
最近更新 更多