-カスタムバリデータ

バリデータを独自につくるのも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がなければ、ページの例外として処理されます。