これは Bean Validation API の目的ではありませんが、これを使用してこの検証を実行できます。BV API の参照実装であるHibernate Validatorを使用すると仮定しています。
単純なバリデーターを使用して、ネガティブ チェックを取り除くことができます。@Field を次のように変更します
@Constraint(validatedBy = MyFieldValidator.class)
public @interface Field {
String type();
int order();
}
MyFieldValidator
そして、次のようにクラスを作成します
public class MyFieldValidator implements ConstraintValidator<Field, Object> {
private int order;
@Override
public void initialize(Field annotation) {
this.order = annotation.order();
if (this.order < 0) {
// blow up
}
}
@Override
public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {
return true;
}
}
次に、たとえば を使用してオブジェクトをバリデーターに通すと、Validation.buildDefaultValidatorFactory().getValidator().validate(someUser)
負の順序アノテーション属性はすべて失敗します。
繰り返しを防ぐことはよりトリッキーです。最も健全なオプションは、User
クラス レベルで検証アノテーションを配置し、リフレクションを使用してアノテーションを 1 つずつ取得することです。クラスレベルのアノテーションを使用する利点は、チェックするクラスを Hibernate Validator に伝える簡単な方法を提供することです。それほど重要でない部分は、クラスに注釈を付けるのを忘れる可能性があることです。