Подтвердить что ты не робот

Bean Проверка @NotNull, @NotBlank и @NotEmpty не работают в JSF + Tomcat

Я использую аннотации Hibernate Validation в моем управляемом JSF bean. Когда я использую @NotNull, @NotBlank или @NotEmpty, они никак не срабатывают.

@NotBlank(message = "{name.required}")
public String name;

Вид:

<h:outputLabel value="Name:" /> 
<h:inputText id="name" value="#{person.name}" size="20" />
<h:message for="name" style="color:red" />

Как это вызвано и как я могу его решить?

4b9b3361

Ответ 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.

Ответ 2

У меня была аналогичная проблема, и я смог преодолеть эту проблему, включив три баночки в web-inf lib. Просто добавьте банку валидатора спящего режима и необходимые банки, как указано в zip файле:

  • hibernate-validator-4.3.0.Final.jar
  • jboss-logging-3.1.0.CR2.jar
  • validation-api-1.0.0.GA.jar

Ответ 3

Если он по-прежнему не может проверить даже после добавления указанных выше банок, возможно, вы пропустили добавление тега

 <mvc:annotation-driven />

в конфигурационном файле spring.