javax.validation.ValidationException:找不到默认提供程序

javax.validation.ValidationException:找不到默认提供程序,java,jsf,tomcat,bean-validation,Java,Jsf,Tomcat,Bean Validation,我向托管bean添加了一些验证(@NotNull),突然出现了这个错误。知道是什么引起的吗?该应用程序在ApacheTomcat7中运行 javax.validation.ValidationException: Unable to find a default provider javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:264) javax.validation.Validation.b

我向托管bean添加了一些验证(
@NotNull
),突然出现了这个错误。知道是什么引起的吗?该应用程序在ApacheTomcat7中运行

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)

应用服务器中应用程序的类路径中似乎没有JSR303bean验证提供程序。如果您使用的是Glassfish,那么最好验证
$Glassfish\u INSTALL\u ROOT/Glassfish/modules
目录中是否存在
bean validator.jar
;GlassFish3.1使用这个JAR(包含Hibernate验证程序实现)作为默认的JSR303bean验证提供程序。我怀疑您使用的是较旧版本的Glassfish,或者其他不包含Bean验证提供程序的应用程序服务器

如果必须在类路径中包含bean验证提供程序,请考虑阅读java API文档,其中声明:

Bean验证提供者是通过 META-INF/services/javax.validation.spi.ValidationProvider文件 遵循下面描述的服务提供者模式

每个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

Hibernate验证器是JSR 303的参考实现,如果您想将其作为标准实现。还有,检查一下。这让我很困惑。我终于发现,是API的提供者负责将映射文件包含在META-INF中,而不是客户端。有人能为这个问题提供一个合适的解决方案吗?