谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

S2CompareValidatorをいじってみる

こないだのSeasar Conferenceで、Teedaの仕様決めに参加させてもらったんですが、その時にS2JSFの複数フィールドバリデータについて、ちょっといいこと教えてもらったので、早速トライ。

S2CompareValidatorの75行目付近を、こんな風に改造。

Object targetValue = ValueHolderUtil.getValue(targetComponent);

Object targetValue = null;
if (targetComponent instanceof UIInput) {
    UIInput input = (UIInput) targetComponent;
    Object submittedValue = input.getSubmittedValue();
    targetValue = RenderUtil.getConvertedValue(context, input, submittedValue);
} else {
    targetValue = ValueHolderUtil.getValue(targetComponent);
;}

おー、できたできた。
これを使って、s2jsf-exampleのvalidator.htmlでfrom側にS2GreatorEqualValidatorを設定したところ、正常にバリデートできました。

通常、S2CompareValidator(もしくはそれを改造した複数フィールドバリデータ)って「一番最後のフィールド」にバリデータを仕掛ける必要があるじゃないですか。だから、一番最後のフィールドは、必須入力にせざるを得なくなって。
でも、必ずしも一番最後のフィールドに値が入るとは限らないので、できれば複数フィールドのうち、必須入力の項目にバリデータを仕掛けたい、と思うわけで。
上記のように修正すれば、とりあえず途中の項目に仕掛けても大丈夫になりました。

ただ、こんなコードが正しいかどうか、分からないんだけど (^^;
もうちょっとソース読んで、全体の流れを把握しないとね。