javax.validation.ValidationException: невозможно найти поставщика по умолчанию

Я добавил некоторую проверку (@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)

person user219882    schedule 28.07.2011    source источник
comment
Hibernate Validator — эталонная реализация для JSR 303, если вы хотите считать ее стандартной реализацией. Кроме того, проверьте этот вопрос о его недоступности в Tomcat 7.   -  person Vineet Reynolds    schedule 28.07.2011


Ответы (1)


Похоже, что в пути к классам вашего приложения на сервере приложений нет провайдера JSR 303 Bean Validation. Если вы используете Glassfish, было бы лучше, если бы вы могли проверить наличие bean-validator.jar в каталоге $GLASSFISH_INSTALL_ROOT/glassfish/modules; Glassfish 3.1 использует этот JAR (который содержит реализацию Hibernate Validator) в качестве поставщика проверки компонентов JSR 303 по умолчанию. Я подозреваю, что вы используете более старую версию Glassfish или другой сервер приложений, который не содержит поставщика проверки компонентов.

Если вы должны включить поставщика проверки компонентов в путь к классам, рассмотрите возможность прочтения документации API Java для ValidationProviderResolver интерфейс, в котором говорится, что:

Поставщики проверки компонентов идентифицируются по наличию файлов META-INF/services/javax.validation.spi.ValidationProvider в соответствии с шаблоном поставщика услуг, описанным здесь

Каждый файл META-INF/services/javax.validation.spi.ValidationProvider содержит список реализаций ValidationProvider, каждая из которых представляет поставщика.

Поэтому, если вы включаете поставщика проверки компонентов в свой путь к классам вручную, вы должны убедиться в наличии файла META-INF/services/javax.validation.spi.ValidationProvider в пути к классам, а также в том, что он содержит имя поставщика проверки компонентов. Содержимое одного из них, предоставленного Glassfish, указано ниже и указывает на класс Hibernate Bean Validator:

org.hibernate.validator.HibernateValidator
person Vineet Reynolds    schedule 28.07.2011
comment
Это смутило меня. Наконец-то я понял, что за включение файла сопоставления в META-INF отвечает поставщик API, а не клиент. - person Johnny Z; 19.09.2013
comment
Может кто-нибудь предложить правильное решение проблемы? - person Ankush Bhan; 05.05.2015