もうちょっとVerificationについて考えてみた。
S2JSFだったら、HTMLにValidationを書いて
Dtoにアノテーションを書いてVerificationにすればOK。
でも、結局、両方に似たような事を書くことになるだろうから、
そのうち面倒くさくなってくるよね。(むら)
基本的にはVerificationの一部を切り出したものがValidationになるだろうから
(Validationの方がVerificationより厳しい事は、ないだろうから)
Validationもアノテーションに反応して行なえるようにしたい。
では、どのようなアノテーションにすれば、そんな事ができるのでしょうか。
■基本方針
Dtoのプロパティに@Requiredとか@MaxLengthみたいなアノテーションをつけて、
Validator/Verifierがそれを見て反応。
アノテーションへの引数の渡し方なんかは、Teedaと同じノリで。
Verifier専用のメソッドは、public booleanなメソッドに
@Verifierというアノテーションを書く。
もしくは、StrutsのActionFormみたいに、Verifyメソッドを実装できる。
あるいは、クラスにアノテーションを付けて、
@VerifierMethod("verifyHoge") みたいに書いておくと
verifyHogeメソッドが呼び出されても良い。
■ウィザード画面で、全バリデータが作動すると@Requiredで軒並みエラーが出るんですが
バリデーションをするのは、Dtoのフィールドに画面からの値を設定しようとした時。
だから画面から値が設定されないフィールドではバリデーションが起こらない。
もちろん、@Requiredなフィールドにnullとか空とか入れようとしたらエラー。
■複数フィールドバリデータは?
悩ましいけど、画面で一番下になる項目(年月日で言えば、日)に
アノテーションをつけるしかないかな。
■ボタンによってValidatorを分けたい時は?
えーっと、これは困る。
Dtoで画面のボタンまでは意識したくない、というのが本音。
だからアノテーションにボタンIDを書くというは、できれば避けたい。
いっそ、Actionのメソッドに引数を持たせるというアイデアでどうか。
もうS2JSFじゃ実現し得ないアイデアになっちゃうけど。
例えばHTMLに
<input id="param1" type="text" m:value="param1" /> <input type="button" m:action="doHoge" /> <input type="button" m:action="doFuga" />
って書いておいて、Actionに
publict String doHoge(FooDto fooDto); publict String doFuga(BarDto barDto);
って書いておく。
doHogeのボタンを押したら、FooDto#setParam1にparam1を渡してdoHogeを呼び出す。
doFugaの方も同様。
それで、FooDto/BarDtoそれぞれのバリデーションを掛ける。
FooDtoもBarDtoも実装はほぼ全く同じになるだろうけど仕方ない。
■更新画面の場合、initialize()でどうやってparam1に値を入れるの?
えっと、、、ペ、、、ページクラス?
なんてやると、PageクラスとDtoでまた同じ値が被りますね。
まぁちょっとこの辺りで行き詰ったんですが、
もうちょっと考えれば答えは出せそうです。