- PR -

バリデータ

投稿者投稿内容
Odakaz
ベテラン
会議室デビュー日: 2004/05/24
投稿数: 70
投稿日時: 2006-07-06 16:27
JSFについてはあまり詳しくないのですが・・・。

DateFormat#setLenientメソッドで、日付を厳密に解釈するかを設定できます。
DateTimeConverterが内部でDateFormatを使っているというのであれば、
このプロパティを指定できたりはしないでしょうか?

[ メッセージ編集済み 編集者: Odakaz 編集日時 2006-07-06 16:29 ]
未記入
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 69
投稿日時: 2006-07-06 18:27
レンダラクラスにバリデータをimplementsさせて、validateメソッドを実装しました。
getConvertedValueメソッド内で、コンバーター処理の前にこのvalidateメソッドをコールしています。
ですが、

>getSubmittedValue()で取ってきたStringをチェックし、invalidならaddMessage()してvalidプロパティをfalseにしてreturn, validだったらsuper.validate()を呼ぶ。

の部分をどうしたらよいかわかりません。
今のままだと、validはfalseにセットされたものの、コンバータ処理が走ってしまいます。
コードをのせてみました。
申し訳ありませんが、再度アドバイス下さい。

----------------------------------------------------------------------------------

public Object getConvertedValue(FacesContext context,UIComponent component,Object value){

// バリデータ(不正な日付ははじく)
validate(context,component,value);

// デフォルトコンバーターを取得
Converter converter = ((ValueHolder)component).getConverter();

Object convertedValue;

// 最終的にバインディングされるオブジェクト
if (converter != null){
// コンバーターが指定されている場合は、その動作に従う
convertedValue = converter.getAsObject(context,component,(String)value);
} else {
// コンバーターが指定されていない場合
convertedValue = DateUtil.toDate((String) value);
}
return convertedValue;
}


----------------------------------------------------------------------------------
public void validate(FacesContext context, UIComponent toValidate, Object value) throws ValidatorException {

// 日本の Locale オブジェクトを作成します。
SimpleDateFormat dtFmt = new SimpleDateFormat("yyyyMMdd",Locale.JAPAN);
Calendar chkDate = Calendar.getInstance();

// エラーチェック
chkDate.setTime(dtFmt.parse((String) value,new ParsePosition(0)));
if((chkDate.get(Calendar.YEAR) != Integer.parseInt(((String) value).substring(0,4)))
|| (chkDate.get(Calendar.MONTH)+1 != Integer.parseInt(((String) value).substring(4,6)))
|| (chkDate.get(Calendar.DATE) != Integer.parseInt(((String) value).substring(6,))){

// 検証が失敗したことを通知
((UIInput)toValidate).setValid(false);
// コンテキストにエラーメッセージを保存
AppBase.putErrorMessageTemplate("error.invalidDate", (String) value);
}
}
未記入
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 69
投稿日時: 2006-07-06 18:30
すみません、ちなみにコンバータ内のtoDateメソッドは以下の通りです。
宜しくお願いいたします。

/**
* String型(yyyyMMdd形式またはyyyyMM形式)からDate型に変換する。
* strがyyyyMM形式の場合は、ついたちが自動でセットされる。
* @param str 日付
* @return 日付
*/
public static Date toDate(String str) {
return toCalendar(str).getTime();
}
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2006-07-06 18:58
引用:

レンダラクラスにバリデータをimplementsさせて、validateメソッドを実装しました。


何か大きな誤解をされてません?

UIInputのvalidateをオーバーライドして、まず自分でチェックしてから、super.validate()を呼んで、型変換その他の標準処理をさせればよい、と提案したつもりです。
UIInputのjavadocをよく読んでください。
未記入
ベテラン
会議室デビュー日: 2005/04/20
投稿数: 69
投稿日時: 2006-07-06 21:36
返信おそくなりました。

すみません、大きく勘違いしていました。
今、やっとできました!!!

色々なアドバイスありがとうございました!

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