Bean Validation Early Draft Preview

JSR 303のBean ValidationにEarly Draft Previewが出たとのことで、早速目を通してみました。個人的に面白いと思った機能を挙げていきます。

Multi-valued constraints

以下の例のように、同一種類のアノテーションを配列で複数指定できるようです。

public class Bean {
    @Patterns({
        @Pattern(regex = "^[0-9-]+$", message = "numbers only"),
        @Pattern(regex = "^...-....$", message = "must match XXX-XXXX")
    })
    private String zipCode;
}

StandardConstraint description

以下のStandardConstraintインターフェイスを制約クラスに実装させることで、バリデーション制約のメタデータを外部フレームワーク向けに公開できる仕組みです。

public interface StandardConstraint {
    StandardConstraintDescriptor getStandardConstraintDescriptor();
}

public class StandardConstraintDescriptor {
    public Boolean getNullability() { return null; }
    public Integer getPrecision() { return null; }
    public Integer getScale() { return null; }
    public Integer getLength() { return null; }
}

この機構は、モデルクラスからDBスキーマを自動生成するような場面で役に立つようです。例えば、上記のgetNullability()がfalseを返す場合、CREATE TABLE文にNOT NULL制約が必要だと判断できます。

Graph validation

オブジェクトグラフを走査して、グラフ内の全オブジェクトをバリデーションできるようです。

Group and group sequence

制約にグループ名を付けて、制約集合のサブセットを構成できるようです。これにより、特定のグループに属する制約だけをバリデーション対象にできます。

使いどころとしては、「状況非依存の制約グループと状況依存の制約グループに分ける」とか「瞬時に検証できる制約グループと検証コストの高い制約グループに分ける」といったシナリオが考えられるそうです。