-カスタムバリデータ
バリデータを独自につくるのもPOJO & POJA(Plain Old Java Annotation)で。前に書いたな。。。コンバータも同様です。
@PropertyValidator(FooDelegation.class) public @interface FooValidator { int value(); }
自身で好きな名前のPOJAを作り、@PropertyValidatorで修飾します。属性には検証処理の委譲先クラス型を指定します。この属性の型はClassですから、POJOにて委譲オブジェクトは実装。
public class FooDelegation implements Serializable { int _min; public void setValue(int min) { _min = min; } @ValidationHandler public void valid(int value, Locale locale) throws FooException { if(value < _min) { throw new FooException(value, _min, locale); } } }
委譲オブジェクトでは、POJAのほうの属性設定を受け入れるために同名プロパティのSetterを作ります。@FooValidatorにmin()属性を作ってますので、コレに対応するFooDelegation#setMin()を用意することになります。実際のバリデーションを行うハンドラを作ります。
ハンドラは普通のメソッドですが、引数にバリデーションする値を受け入れる引数があるほか、バリデーション作業に必要なモノ(例ではLocale)がほしければ引数に宣言しておきます。フレームワークが実行時には自動で用意してくれます。検証成功だと何もせず、失敗の場合は例外を投げます。
で、モデルにて作ったアノテーションを使う。
@PageModel(ModelScope.SESSION) public interface BarModel { @FooValidator(5) @ErrorMessageTo("error") int getBar(); String getError(); }
これで、barプロパティに5未満の値が入ったら、検証失敗として例外が発生し、それをキャッチ&メッセージを取得して、@ErrorMessageToで指定しているerrorプロパティの値としてセットします。@ErrorMessageToがなければ、ページの例外として処理されます。