Дайте мне знать, если это приемлемое решение для вас -
@Constraint(validatedBy = CommonValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyValidator{
// this decides what actual validator we will use
String validator();
String message() default "{error.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Теперь в CommonValidator
мы можем определить фактический валидатор на основе значения validator
.
Пример проверки c:
public class SomeValidator {
public static boolean isValid(Object field, ConstraintValidatorContext context) {
// your actual validation code
}
}
Аналогично вы можете определить и другие ваши валидаторы.
Вот как вы можете использовать данные c валидатор в фактическом валидаторе:
public class CommonValidator implements ConstraintValidator<MyValidator, Object> {
private String validator;
@Override
public void initialize(MyValidator myValidator) {
this.validator = myValidator.validator();
// do other inits as per your requirement
}
@Override
public boolean isValid(Object field, ConstraintValidatorContext context) {
ValidatorFactory.getValidator("someValidator").isValid(field, context)
// return other validators like above
return false;
}
}
наконец, вы можете использовать свою аннотацию вот так -
@MyValidator(validator = "someValidator")
private Object object;
Объект может быть любым другим классом, который вы должны обработать это в отдельном стати c валидатор.
FYI - это всего лишь идея, фактическая реализация может отличаться в зависимости от вашего варианта использования.