1

私は Bean 検証に取り組んでおり、独自の Bean 検証アノテーションのデフォルト グループを設定する可能性を探しています。

私はこのようなもの(作業)を持っています:

Application.class (MyBean で検証を呼び出す)

public class Application {
    public static void main(String[] args) {
        Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
        Set<ConstraintViolation<MyBean>> violations =
            validator.validate(new MyBean(), SecondStep.class);
    }
}

MyBean.class (Bean 自体。これが私が防ぎたいことです)

public class MyBean {
    // I don't want to write this "groups" attribute every time, because it's very clear,
    // that this should only be validated for the second step, isn't it?
    @RequiredBySecondStep(groups=SecondStep.class)
    private Object myField;
}

RequiredBySecondStep.class (Bean 検証アノテーション)

@Documented
@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = RequiredBySecondStepValidator.class)
public @interface RequiredBySecondStep {
    String message() default "may not be null on the second step";
    Class<?>[] groups() default {};   // <-- here I want to set SecondStep.class
    Class<? extends Payload>[] payload() default {};
}

RequiredBySecondStepValidator.class (実装された制約バリデーター)

public class RequiredBySecondStepValidator implements ConstraintValidator<RequiredBySecondStep, Object> {
    public void initialize(RequiredBySecondStep constraintAnnotation) {
    }

    public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {
        return object != null;
    }
}

SecondStep.class (Bean 検証グループ)

public interface SecondStep {
}

RequiredBySecondStep残念ながら、仕様上、次のようにアノテーションでデフォルト グループを設定することはできません。

Class<?>[] groups() default SecondStep.class;
// and using just the following in the bean:
@RequiredBySecondStep
private Object myField;

これにより、RuntimeException が発生します。

javax.validation.ConstraintDefinitionException: groups() のデフォルト値は空の配列でなければなりません

さらに、SecondStepだけではありません。@RequiredByFirstStepまたはで直接注釈を付けたい 5 つの異なるグループがあると思われ@RequiredByFifthStepます。

これを実装する良い方法はありますか?

4

1 に答える 1

2

私はあなたがそれをすべて少し間違っていたと思います。あなたが望むことを行う方法は確かにあり、それは制約の側面と a を介したそれらの検証ConstraintValidatorがグループとグループシーケンスに直交しているためです。設計ごとに、制約 (注釈とそのバリデーター) は、検証されるグループから独立している必要があります。これを機能させたとしても、移植性の制約にはなりません。個人的には、あなたが達成したいことを再考します。@RequiredByFirstStep要件が何であるかを教えてくれません。それらが検証しているもの (文字列の長さ、null ではないなど) を暗示する制約を作成する必要があります。それらが実行される条件は、グループ インターフェイスによって制御されます。

于 2015-08-22T19:05:10.183 に答える