2010-12-14 9 views
2

ページ上にクロスバリデーションが必要なフィールドがあります。しかし、私は、このフィールドの<h:message>にこのバリデーションのエラーが表示されることを望んでいません。JSFでフィールドを検証して例外をスローしますが、別のフィールドにエラーメッセージを添付しますか?

いずれかのフィールドにバリデーターを追加し、バリデーターが例外をスローすると、このフィールドのエラーは<h:message>に表示されます。一方、私はページの送信を抑止したい場合、例外をスローする必要があります。いくつかのエラーメッセージを表示するだけでは不十分です。

私はフォームにいくつかの隠しフィールドを作成し、そこでバリデーターを添付しました。このバリデーターは、検証したいフィールドのUIComponentsにアクセスできるので、検証することができます。バリデータが例外をスローすると、エラーが<h:message>に表示されます。隠しフィールドはどこにでも置くことができます。

フィールドの後ろに非表示フィールドを置くと、すべて動作します。 (私が前に置いた場合、フィールドのUIComponentも更新される前に、隠しフィールドの検証が行われます)。

問題はそれが厄介なハックです:それを行うにはいくつかのより良い方法はありますか?

答えて

3

問題はそれが厄介なハックです:それを行うにはいくつかの良い方法がありますか?

特定の機能要件はありません。 JSFでは、複数のフィールドの相互検証のためのきめ細かな制御はほとんどできません。

フィールドの後ろに非表示フィールドを置くと、すべて動作します。 (私が前に置いた場合、フィールドのUIComponentも更新される前に、隠しフィールドの検証が行われます)。

コンポーネントは検証中にコンポーネントツリーに表示される順序で処理されます。ある時点で手でまだUIInputが処理されている場合は、提出された値をUIInput#getSubmittedValue()で取得する必要があります。すでに処理されている場合は、代わりにUIInput#getValue()でサブミットされた(変換され、検証された)値を取得する必要があります。

の非表示フィールドをの検証対象コンポーネントの後に置くと、値を取得するのにUIInput#getValue()が必要です。非表示フィールドにと入力した場合、有効なコンポーネントであるの前に値を取得するにはUIInput#getSubmittedValue()が必要です。

+0

他のフィールドを検証するためにのみ非表示フィールドが必要なようです。 「getSubmittedValue()」ヒントありがとう! – amorfis

+0

ようこそ。 – BalusC

0

私は私のために働いて、このコードを持っている:

スロー新しいValidatorExceptionを(新しいArrayListを());

エラーは表示されていません。

関連する問題