谷本 心 in せろ部屋

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

もうちょっと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でまた同じ値が被りますね。


まぁちょっとこの辺りで行き詰ったんですが、
もうちょっと考えれば答えは出せそうです。