- PR -

バリデータ

投稿者投稿内容
未記入
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 69
投稿日時: 2006-07-05 11:24
いつもお世話になります。

カスタムコンポーネントを作成しています。
そのカスタムコンポーネント内でデータチェックを行いたいのですが、
カスタムコンポーネントにバリデータ機能を埋め込むにはどうしたら良いか悩んでいます。

作成したカスタムコンポーネントには、マネージドビーンにバリューバインディングする処理があります。
バインディングを行う前にチェックを走らせて、バインディングしようとするデータのエラーをはじきたいのですが…

チェックメソッドを作成したとして、そのメソッド内で拾ったエラーをJSPに反映させることは可能でしょうか?
通常のvalidater同様にメッセージが表示されるようにしたいと考えています。

ご存知であれば、アドバイス下さい。
宜しくお願いします。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-07-05 20:46
JSFの話ですよね(違ったらすみません)。
>そのメソッド内で拾ったエラーをJSPに反映させることは可能でしょうか?
>通常のvalidater同様にメッセージが表示されるようにしたいと考えています。
FacesContext.addMessageを使えばOKです。
未記入
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 69
投稿日時: 2006-07-06 10:12
はい、JSFです!!
すみません、もうひとつ質問させてください!

チェックメソッドでエラーをはじいて、FacesContext.addMessageで
メッセージを表示するとします。
その際、入力値をビーンにバインディングせず、かつその入力値を画面に表示させた状態でリロードしたいのですが、可能でしょうか?


よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-07-06 10:49
標準的なJSFライフサイクルでは、チェックはProcess Validationsフェーズで実施します。例えば、カスタムコンポーネントのvalidateValueメソッドで実施するのがいいでしょう。super.validateValue()の後でチェックロジックを入れて、失敗したらaddMessageしてvalidプロパティをfalseにします。
UIInput.validateValue()のjavadocを参照して下さい。
未記入
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 69
投稿日時: 2006-07-06 11:22
返信ありがとうございます。

すみません、勉強不足でよく理解できていないのですが…
是非、教えてください!

プロセス・バリデーション・フェーズは、リクエストがコンポーネントに反映された後に実行されますよね?
カスタムコンポーネントのvalidateValueメソッドを作成して、どこかで呼び出さないといけないということですか?

decode()メソッドが呼び出されて、EditableValueHolderインターフェースのsetSubmittedValueメソッドを使って、コンポーネントに代入しているのですが、その後にvalidateValueメソッドを呼び出すのですか?
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-07-06 11:32
validateValueは標準のvalidateが、validateは標準のprocessValidatorsが呼んでくれます。UIInputのjavadocを参照して下さい。
(UIInputを継承していることが前提ですが、当然継承してますよね)

「よくわかるJavaServer Facesのしくみ」にはシーケンス図が書いてあります。
未記入
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 69
投稿日時: 2006-07-06 11:56
ありがとうございます!

UIInputを継承しています。
カスタムコンポーネントクラスにvalidateValueメソッドを作成したところ、
レンダラ、コンバータ実行後、呼ばれました!!

そこで、さらに質問したいのですが…
たびたび申し訳ないです。

コンバータでは、20060701のような8桁のStringをDate型に変換しています。
もし、20060631のような不正な日付がクライアントから送られてきたときは、
バリデータではじこうと考ています。
ですが、コンバータでDate型に変換している以上、20060701と自然に修正されてしまい、バリデータではじくことができません。

不正な日付をはじくには、どういう考え方でコーディングすると良いでしょうか?
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-07-06 14:44
引用:

コンバータでは、20060701のような8桁のStringをDate型に変換しています。
もし、20060631のような不正な日付がクライアントから送られてきたときは、
バリデータではじこうと考ています。
ですが、コンバータでDate型に変換している以上、20060701と自然に修正されてしまい、バリデータではじくことができません。
不正な日付をはじくには、どういう考え方でコーディングすると良いでしょうか?


DateTimeConverterはjava.text.DateFormat.parse()を使っているはずですが、6/31が7/1になるのはDateFormatの仕様なんですかねぇ。知りませんでした。

UIInput.validate()から呼ばれるgetConvertedValue()が指定された、あるいはデフォルトのコンバータを使って型変換をするので、その前でチェックしてはどうでしょうか?
validate()をオーバーライドして、getSubmittedValue()で取ってきたStringをチェックし、invalidならaddMessage()してvalidプロパティをfalseにしてreturn, validだったらsuper.validate()を呼ぶ。

スキルアップ/キャリアアップ(JOB@IT)