JSR 303 Bean Validator

The Java Community Process(SM) Program - JSRs: Java Specification Requests - detail JSR# 303

JSR 303というのが策定中らしい。

これは Javaオブジェクトのプロパティ値のバリデーションに関する仕様で、アノテーションを使って値の取るべき範囲や条件を設定し、標準化された方法でバリデーションを実行する。JavaEE アプリだけでなく一般的な Swing アプリ等でも使える、というものらしい。

既にリファレンス実装として Hibernate Validator 4 というライブラリが作成されている。これはHibernate O/Rマッパから独立したコンポーネントでO/Rマッパのライブラリが無くても利用できる。

試しに使ってみた。

ここからhibernate-validator 4.0.0bをダウンロードしてjarを全部クラスパスにぶち込む。ただ、 stax や jaxb は XMLコンフィグを書かないなら要らないかも。JSR303にはXMLで書かれたコンフィギュレーションを読み込む仕様があり、そのために必要なjarだと思われる。

import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.constraints.NotNull;

public class Hoge {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Hoge hoge = new Hoge();

        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

        Set<ConstraintViolation<Hoge>> results = validator.validate(hoge);

        System.out.println(results.size());     // 1
    for (ConstraintViolation<Hoge> c: results) {
      // fuga of Hoge may not be null と出力
      System.out.println(c.getPropertyPath() + " of " c.getRootBean() + " " + c.getMessage());

            // null と出力
      System.out.println(c.getInvalidValue());
    }

        hoge.fuga = "ああああああああ";

        Set<ConstraintViolation<Hoge>> results2 = validator.validate(hoge);
        System.out.println(results2.size());    // 0
    }

    @NotNull
    private String fuga;

    public String toString() {
        return "Hoge";
    }
}

基本的な使い方は、検査したい JavaBean の getter または field にアノテーションをつけ、Validator を取得して validate メソッドに検査するオブジェクトを渡すだけ。エラーは戻り値のSetに格納され、エラーがなければ戻り値のSetオブジェクトは空のSetになる。

とても分かりやすい仕様で良さげ。