- - PR -
バリデータ
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-07-06 16:27
JSFについてはあまり詳しくないのですが・・・。
DateFormat#setLenientメソッドで、日付を厳密に解釈するかを設定できます。 DateTimeConverterが内部でDateFormatを使っているというのであれば、 このプロパティを指定できたりはしないでしょうか? [ メッセージ編集済み 編集者: Odakaz 編集日時 2006-07-06 16:29 ] | ||||
|
投稿日時: 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); } } | ||||
|
投稿日時: 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(); } | ||||
|
投稿日時: 2006-07-06 18:58
何か大きな誤解をされてません? UIInputのvalidateをオーバーライドして、まず自分でチェックしてから、super.validate()を呼んで、型変換その他の標準処理をさせればよい、と提案したつもりです。 UIInputのjavadocをよく読んでください。 | ||||
|
投稿日時: 2006-07-06 21:36
返信おそくなりました。
すみません、大きく勘違いしていました。 今、やっとできました!!! 色々なアドバイスありがとうございました! |