Ответ 1
Введение
Поскольку вы не представили никаких комментариев по моему комментарию с вопросом, какой контейнер вы используете, я заглянул в вашу историю вопросов, чтобы узнать, какие контейнеры вы используете. Насколько я нашел только Tomcat. Так что я на этот ответ предполагаю, что вы действительно используете Tomcat, как я изначально догадывался при публикации комментария.
Убедитесь, что вы установили все JAR
Tomcat не отправляет с помощью JSR303 Bean API проверки/реализации. Вам нужно загрузить и установить его самостоятельно. То, что вы получили эти аннотации для компиляции, означает, что вы правильно сбросили файл hibernate-validator.jar
(именование может отличаться для каждой версии) в папке /WEB-INF/lib
вашего веб-приложения. То, что эти аннотации, в свою очередь, никак не работают, может означать только то, что вы не читали readme.txt
и/или не забыли добавить JAR из папки /lib/required
в библиотеке zip/tgz библиотеки Hibernate Validator: slf4j-api.jar
и validation-api.jar
. Последний является обязательным для того, чтобы аннотации действительно работали. Итак, чтобы заставить Hibernate Validator работать в Tomcat, вам нужны следующие JAR в webapp /WEB-INF/lib
:
-
validation-api.jar
(содержит абстрактный API и сканер аннотаций) -
hibernate-validator.jar
(содержит конкретную реализацию) -
slf4j-api.jar
(просто чтобы заставить его работать с журналом)
Этот способ @NotBlank
и @NotEmpty
должен работать. @NotNull
заслуживает особого внимания; пустые поля ввода, а именно, по умолчанию принимаются как пустые строки от клиента (webbrowser) из-за характера параметров HTTP-запроса. Пустые строки - это не то же самое, что и null
, поэтому @NotNull
будет по умолчанию никогда не запускаться. JSF, однако, настраивается для их интерпретации как null
, просто добавив следующий параметр контекста в web.xml
:
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
Таким образом, @NotNull
должен работать.
BV работает, но только пустые поля не
Если он все еще не работает (т.е. ни одна из трех аннотаций не работает, но другие, такие как @Size(min=5)
для минимальной длины 5 отлично работает), тогда вероятность того, что у вас есть следующий параметр контекста в web.xml
:
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>false</param-value>
</context-param>
Затем вы должны удалить его (по умолчанию он равен auto
, то есть только тогда, когда JSR303 Bean Validation API найден в пути к среде выполнения) или для его установки true
.
BV не работает вообще
Когда на самом деле ничего из BV не работает, также @Size
, @Pattern
и т.д., то вы должны убедиться, что у вас не есть следующие в вашей форме:
<f:validateBean disabled="true" />
Затем вы должны удалить его (он будет просто по умолчанию включать) или установить disabled="false"
.
Убедитесь, что вы используете последний Mojarra
Когда BV все еще не работает, проверьте, не используете ли вы прежнюю версию Mojarra между 2.2.3 и 2.2.6. В этих версиях была ошибка делегатского класса, вызывающая Bean Validation on Tomcat и клоны, чтобы быть полностью невидимой. Это сообщается как вопрос Mojarra 3183 и исправлено в Mojarra 2.2.7.