谷本 心 in せろ部屋

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

複数フィールドバリデータ考

Strutsに比べて、最近のJSF系Webフレームワークで困るのが、複数フィールドのバリデータ。値を入れないとバリデーションしないとか、S2CompareValidatorだけだと最後のフィールドにバリデータを設定しなければいけないのが厄介。
とは言っても、いつまでもストラーツ、ストラーツと言ってられないので、さくっと解決策を考える。

まず、やりたいこと。

  1. 複数フィールドの合計が○○文字まで (例 : 住所1、住所2の合計が80文字以内)
  2. 複合して出来る値が検証ルールに従う (例 : 複数フィールドに分かれた年月日)
  3. 一つ入力すると、他も全部入力が必須 (例 : 3つのテキストフィールドに分かれた電話番号)
  4. いずれか一つ入力する必要がある (例 : 購入した商品の商品番号、商品名、ユーザID、のいずれか)
  5. かつ、エラーメッセージを出す場所はフレキシブルにしたい。

この実現手段を考える。

Action以降で実施
自由に検証ルールを決められるため、1〜4には対応できるが、エラーメッセージが h:messages タグのある場所にしか出せず、5を満たせない。
Actionクラスのインターセプタで実施
結局は上と同じ。
バリデータでSubmittedValueを取得して検証
以前のエントリに書いたもの。4以外はこれで対応できる。

結局、困るのは「いずれか一つ」だけ。なんか最近SeasarのUser-MLにも同じような話題が出てたし、ちょっとやってみるかー。


追記:
結局、思いつくのは、こんな感じ。

  1. isEmptyの条件を外してバリデータ呼ぶ。
  2. カスタムタグで <requiredGroup target="xxx,xxx,xxx" selection="[all|0-9]"> を定義。対象のコンポーネントを囲むか、単独で存在させるかは、若干悩む。
  3. 上記処理をTeedaアノテーションで。

まぁ、1はsexyじゃないんで却下して、3を見据えながら、まずは2かな。