Strutsに比べて、最近のJSF系Webフレームワークで困るのが、複数フィールドのバリデータ。値を入れないとバリデーションしないとか、S2CompareValidatorだけだと最後のフィールドにバリデータを設定しなければいけないのが厄介。
とは言っても、いつまでもストラーツ、ストラーツと言ってられないので、さくっと解決策を考える。
まず、やりたいこと。
- 複数フィールドの合計が○○文字まで (例 : 住所1、住所2の合計が80文字以内)
- 複合して出来る値が検証ルールに従う (例 : 複数フィールドに分かれた年月日)
- 一つ入力すると、他も全部入力が必須 (例 : 3つのテキストフィールドに分かれた電話番号)
- いずれか一つ入力する必要がある (例 : 購入した商品の商品番号、商品名、ユーザID、のいずれか)
- かつ、エラーメッセージを出す場所はフレキシブルにしたい。
この実現手段を考える。
- Action以降で実施
- 自由に検証ルールを決められるため、1〜4には対応できるが、エラーメッセージが h:messages タグのある場所にしか出せず、5を満たせない。
- Actionクラスのインターセプタで実施
- 結局は上と同じ。
- バリデータでSubmittedValueを取得して検証
- 以前のエントリに書いたもの。4以外はこれで対応できる。
結局、困るのは「いずれか一つ」だけ。なんか最近SeasarのUser-MLにも同じような話題が出てたし、ちょっとやってみるかー。
追記:
結局、思いつくのは、こんな感じ。
- isEmptyの条件を外してバリデータ呼ぶ。
- カスタムタグで <requiredGroup target="xxx,xxx,xxx" selection="[all|0-9]"> を定義。対象のコンポーネントを囲むか、単独で存在させるかは、若干悩む。
- 上記処理をTeedaのアノテーションで。
まぁ、1はsexyじゃないんで却下して、3を見据えながら、まずは2かな。