web-dev-qa-db-ja.com

Bean検証@ NotNull、@ NotBlankおよび@NotEmptyはJSF + Tomcatで機能しません

JSF管理BeanでHibernate Validationアノテーションを使用しています。 @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" />

これはどのように引き起こされ、どうすれば解決できますか?

27
Mahmoud Saleh

前書き

どのコンテナを使用しているのかという質問に対する私のコメントに対するフィードバックを提供しなかったため、質問履歴を覗いて、どのコンテナを使用しているかを確認しました。これまでのところ、 Tomcat のみが見つかりました。したがって、この回答では、コメントを投稿するときに最初に推測したとおり、実際にTomcatを使用していると仮定します。

必ずすべてのJARをインストールしてください

Tomcatには、JSR303 Bean Validation API /実装はそのままでは出荷されていません。 ダウンロードしてインストール する必要があります。コンパイルするためにこれらの注釈を取得したということは、Webアプリケーションの_hibernate-validator.jar_フォルダーに_/WEB-INF/lib_ファイル(バージョンごとに名前が異なる場合があります)を正しくドロップしたことを意味します。これらの注釈が順番に機能しないように見えるということは、_readme.txt_を読んでいなかったこと、および/またはHibernate ValidatorライブラリZipの_/lib/required_フォルダーからJARを追加するのを忘れたことを意味します。/tgzファイル:_slf4j-api.jar_および_validation-api.jar_。最後のアノテーションは、アノテーションを実際に機能させるために必須です。そのため、TomcatでHibernate Validatorを機能させるには、webappの_/WEB-INF/lib_に次のJARが必要です。

  • _validation-api.jar_(抽象APIと注釈スキャナーを含む)
  • _hibernate-validator.jar_(具体的な実装を含む)
  • _slf4j-api.jar_(そのロガーを機能させるためだけに)

このように _@NotBlank_ および _@NotEmpty_ が機能する必要があります。 _@NotNull_ は特別な注意に値します。空の入力フィールドは、HTTP要求パラメーターの性質上、デフォルトでクライアント(webbrowser)から空の文字列として受信されます。空の文字列は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は機能しますが、空のフィールドだけは機能しません

stillが機能しない場合(つまり、3つの注釈が機能しないが、 @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_ なども機能しない場合は、notフォームには次のものがあります:

_<f:validateBean disabled="true" />
_

次に、それを削除するか(デフォルトで起動します)、または_disabled="false"_を設定します。

必ず最新のMojarraを使用してください

BV stillが機能しない場合、2.2.3から2.2.6の間に古いMojarraバージョンを使用していないかどうかを確認します。これらのバージョンには、TomcatとクローンのBean Validationが完全に見えないようにするクラスローディングデリゲートバグがありました。これは Mojarra issue 318 として報告され、Mojarra 2.2.7で修正されました。

66
BalusC

同様の問題があり、web-inf libに以下の3つのjarを含めることで問題を克服できました。 Zipファイルで提供されているhibernateバリデーターjarと必要なjarを追加するだけです。

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