2012-02-23 16 views
4

で空のフィールドを検証:は、私は次の入力フィールドがあり、インライン検証方法と検証クラス

<h:inputText value=".." validator="#{labController.validateValue}"/> 

フィールドが空の場合、それは(labControllervalidateValueが呼び出されていない)検証されることはありません。

しかし、別のバリデータクラスを使用して:

<h:inputText value=".." > 
    <f:validator validatorId="labDateValidator"/> 
</h:inputText> 

そのvalidate方法がよくしても、空の入力フィールドで呼び出すこと?

これは私が観察したものです。この動作は、実装またはバージョンに依存しますか(Mojarra 2.1を使用していますか?

背景私は、必要な検証を含むすべての検証タスクに自分のメソッド/クラスを使用したいと考えています。バリデータークラスでのみ動作しますか?

答えて

6

あなたはJSFの監督に当たっています。 validatorMethodExpressionValidatorにラップされており、validate()メソッドのソースによれば、値がnullの場合、検証は実際にスキップされます。

if (value != null) { 
    try { 
     ELContext elContext = context.getELContext(); 
     methodExpression.invoke(elContext, new Object[]{context, component, value}); 
     ... 

これはtrueデフォルト新しいJSF 2.0 javax.faces.VALIDATE_EMPTY_FIELDSコンテキストパラメータを考慮していません。実際にはUIInput#validate()と同じことを行う必要があります。

if (!isEmpty(newValue) || validateEmptyFields(context)) { 
    try { 
     ELContext elContext = context.getELContext(); 
     methodExpression.invoke(elContext, new Object[]{context, component, value}); 
     ... 

これは既にMojarra issue 1508と報告されています。私はそれに投票し、それらを目を覚ます新しいコメントを追加しました。

+0

説明のためにありがとうございます、BalusC。幸いにも、私はバリデーションメソッドを問題なくバリデーションクラスに委託することができました。 (バグのページへのコメント:「これらはすべて、遅くともGF 3.1 M6のために行われます!」1年以上前にリリースされた –

+0

:-)。どうやら、まだ行われていない:) – BalusC

+0

@MattHandyを:私はここに別の何かを持っている: 'pに対して:inputText'または' F:validator' inputText'、私は 'Pの両方のいずれか' validator'属性を使用することができます。しかし 'p:selectOneMenu'では' f:validator'だけが動作します。 JSF 2.2がリリースされることをいつ認識していますか? –

関連する問題