Как я могу использовать аннотацию в классе Validator? - PullRequest
1 голос
/ 28 мая 2019

Я знаю, это может звучать странно, но мне нужно выполнить такое требование в моем проекте.Давайте перейдем к делу.

Я создал пользовательскую аннотацию, которая также использует @Constraint, и реализовал мою собственную логику проверки в другом классе, который реализует интерфейс ConstraintValidator.К сожалению, javax.validation никогда не добавлялся в качестве зависимости к этому проекту (@Valid, @NotBlank, @Email и т. Д. Не работают), поэтому я вынужден реализовать интерфейс Validator.

Я знаю, что могу поместить свою пользовательскую логику в метод Validator validate() (пробовал, и это работает), но я бы предпочел, чтобы я мог сохранить свою пользовательскую аннотацию на случай, если она понадобится другому разработчику.будущее, когда «стандарты проекта» изменятся.

Могу ли я как-нибудь вызвать метод моей аннотации isValid() из экземпляра Validator?Возможно ли это, или это все еще разумно, учитывая тот факт, что мне не разрешено добавлять зависимость?

Отрывки кода TLDR: (пишу на моей голове, извините, если есть какие-либо синтаксическиеошибки)

Пользовательская аннотация

@Retention(RUNTIME)
@Target({TYPE})
@Constraint(validatedBy = myCustomValidator.class)
public @interface myCustomAnnotation {
    String message() default "dummy";
    Class[] groups() default {};
    Class[] payload() default {};

    class myCustomValidator implements ConstraintValidator<myCustomAnnotation, Object> {
        // @Overload initialize
        // some code here

        // @Overload isValid
        public boolean isValid(Object object, ConstraintValidatorContext ctx) {
            // some code here, simple return for demonstration purposes
            return object != null;
        }
    }
}

Пользовательский валидатор

public class customValidator implements Validator {
    //@Override supports
    //@Override validate
    public void validate(Object target, Errors errors) {
        // somehow invoke my custom annotation here, no other validation code should be here
    }
}

Ожидаемое использование с валидатором

public ModelAndView customController(@ModelAttribute("form") CustomForm form, BindingResult errors) {
    Validator validator = new CustomValidator();
    validator.validate(form, errors);
    // expecting errors.hasErrors() to be filled
    // ...
}
...