バリデーション

Cubby では以下のように、アクションメソッドに対して入力検証のルールを定義します。

  1. インターフェイスValidationRulesのインスタンスとして入力検証のルールを定義します。
  2. それをアクションクラスのプロパティとして取得できるようにします。
  3. アクションメソッドにアノテーション@Validationを定義し、rulesFieldでアクションメソッドと入力検証プロパティを関連付けます。(指定しなかった場合は「VALIDATION」が使用されます)

入力検証でエラーを検出した場合は、アクションのプロパティerrorsにメッセージが設定され、errorPageで指定されたページに遷移します。

また、Cubbyにクライアントサイドバリデーションはありません。

  // 検証ルールのプロパティとしてデフォルトの「VALIDATION」が使用されます。
  // 検証エラー発生時は「confirm.jsp」に遷移します。
  @Form
  @Validation(errorPage = "confirm.jsp")
  public ActionResult save1() {
    ... 
  }

  // 検証ルールのプロパティとして「validation2」が使用されます。
  // 検証エラー発生時は「confirm.jsp」に遷移します。
  @Validation(rulesField="validation2", errorPage = "confirm.jsp")
  public ActionResult save2() {
    ... 
  }

バリデーションの定義はJavaコードで記述します。以下のようにDefaultValidationRulesを継承して、 initializeメソッド内で addメソッドで フィールドごとにバリデーションのルールを追加します。

バリデーションの一覧はorg.seasar.cubby.validator.validatorsを参照してください。

public class LoginAction extends Action {
  public static ValidationRules VALIDATION = new DefaultValidationRules() {
    @Override
    public void initialize() {
      add("userId", new RequiredValidator(), new MaxLengthValidator(10));
      add("password", new RequiredValidator(), new MaxLengthValidator(10));
    }
  };
  ...
}

定義済みバリデーション

Cubbyで定義済みのバリデーションクラスは以下のものがあります。 詳細は定義済みバリデーションのAPIドキュメントをご覧下さい。

定義済みバリデーションクラス一覧

クラス名説明
ArrayValidator配列のパラメータに対して入力検証を行います。
DateFormatValidator日付に対する検証を行います。
EmailValidatorEメールアドレスに対する検証を行います。
EqualsValidator指定した文字列と等しいかどうかを検証します。
FileRegexpValidatorファイルアップロードのファイル名が指定された正規表現にマッチするか検証します。
MaxLengthValidator最大文字数を検証します。
MaxSizeValidator配列の最大サイズを検証します。
MinSizeValidator配列の最小サイズを検証します。
NumberValidator数値かどうかを検証します。
RangeLengthValidator文字列の長さの範囲を指定して検証します。
RangeValidator数値の範囲を指定して検証します。
RegexpValidator指定された正規表現にマッチするか検証します。
RequiredValidator必須検証します。

バリデーションのエラーメッセージ

バリデーションのエラーメッセージは以下のルールで作成されます。

  • メッセージキーを指定しない場合、パラメータ名がエラーメッセージ中の項目名のメッセージキーとして使用されます。
  • メッセージキーを指定する場合、指定されたメッセージキーがエラーメッセージ中の項目名のメッセージキーとして使用されます。
  • DefaultValidationRules のコンストラクタでキーの項目名のメッセージキーのプリフィックスを指定することができます。
  • 各バリデーションのコンストラクタでメッセージキーを指定することで検証時のエラーメッセージを切り替えることもできます。
    public class LoginAction extends Action {
    
      // 項目のメッセージキーを指定
      public static ValidationRules VALIDATION = new DefaultValidationRules() {
        @Override
        public void initialize() {
          // メッセージキー"userId"の値がエラーメッセージ中の項目名として使用されます。
          add("userId", new RequiredValidator(), new MaxLengthValidator(10));
          // メッセージキー"login.password"の値がエラーメッセージ中の項目名として使用されます。
          add("password", "login.password", new RequiredValidator(), new MaxLengthValidator(10));
        }
      };
    
      // 項目名のメッセージキーのプリフィックスを指定
      public static ValidationRules VALIDATION2 = new DefaultValidationRules("login.") {
        @Override
        public void initialize() {
          // メッセージキー"login.userId"の値がエラーメッセージ中の項目名として使用されます。
          add("userId", new RequiredValidator(), new MaxLengthValidator(10));
        }
      };
    
      // 各バリデーションにメッセージキーを指定
      public static ValidationRules VALIDATION3 = new DefaultValidationRules() {
        @Override
        public void initialize() {
          // メッセージキー"err.myrequired"がエラーメッセージとして使用されます。
          add("password", new RequiredValidator("err.myrequired"));
        }
      };
    
      ...
    }

バリデーションルールのコピー

ほとんどが同じでいくつかの項目が異なる複数のルールを作りたい場合、以下のように他のルールをコピーして使用することができます。

public class LoginAction extends Action {

  // ベースのルール
  public static ValidationRules BASE_VALIDATION = new DefaultValidationRules() {
    @Override
    public void initialize() {
      add("userId", new RequiredValidator(), new MaxLengthValidator(10));
      add("password", "login.password", new RequiredValidator(), new MaxLengthValidator(10));
    }
  };

  // ベースのルールに「nickname」の検証を追加
  public static ValidationRules VALIDATION1 = new DefaultValidationRules() {
    @Override
    public void initialize() {
      // BASE_VALIDATIONのルールをコピーして追加
      getRules().addAll(BASE_VALIDATION.getRules());
      add("nickname", new RequiredValidator(), new MaxLengthValidator(10));
    }
  };

  // ベースのルールに「password2」の検証を追加
  public static ValidationRules VALIDATION2 = new DefaultValidationRules() {
    @Override
    public void initialize() {
      // BASE_VALIDATIONのルールをコピーして追加
      getRules().addAll(BASE_VALIDATION.getRules());
      add("password2", new RequiredValidator(), new MaxLengthValidator(10));
    }
  };
  ...
}

独自バリデーションの定義

独自のバリデーションはValidatorを実装して作成します。 通常はBaseValidatorを継承して作成します。

public class MaxLengthValidator extends BaseValidator {

  private final int max;

  public MaxLengthValidator(final int max) {
    this(max, "valid.maxLength");
  }

  public MaxLengthValidator(final int max, final String messageKey) {
    this.max = max;
    this.setMessageKey(messageKey);
  }

  // 検証メソッド、戻り値はエラーメッセージ。戻り値がnullなら検証エラーなし。
  public String validate(final ValidationContext ctx) {
    final Object value = ctx.getValue();
    if (value instanceof String) {
      String str = (String) value;
      if (StringUtil.isEmpty((String) value)) {
        return null;
      }
      if (str.length() <= max) {
        return null;
      }
    } else if (value == null) {
      return null;
    }
    return getMessage(getPropertyMessage(ctx.getName()), max);
  }
}