Как использовать @Autowired внутри ConstraintValidator? - PullRequest
0 голосов
/ 14 октября 2019

Можно ли использовать внедрение зависимостей в ConstraintValidator, определенном как вложенное в @interface?

Я создал пользовательскую аннотацию, которая должна проверять некоторые данные.

CodebookValidator - это обычный класс: он не аннотируется @Service, @Component ... Однако DI не работает, даже когда я аннотирую его @Service ...

Есть идеи, как использовать @Autowired внутри ConstraintValidator? Вот фрагмент кода:

@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CodebookValue.CodebookValidator.class)
public @interface CodebookValue {

    Codebook value();

    String message() default "Not valid";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    class CodebookValidator implements ConstraintValidator<CodebookValue, String> {

        @Autowired
        private CodebookService codebookService; // this won't work it's null at runtime

        private Codebook codebook;

        @Override
        public void initialize(CodebookValue constraintAnnotation) {
            codebook = constraintAnnotation.value();
        }

        @Override
        public boolean isValid(String value, ConstraintValidatorContext ctx) {
            String translate = codebookService.translate(value, codebook, codebook.getSourceSystem());
            return StringUtils.isEmpty(translate);
        }
    }
}

1 Ответ

2 голосов
/ 14 октября 2019

Вы можете предоставить свой собственный Validator бин с возможностью автоматической сборки Spring:

@Bean
public Validator validator(final AutowireCapableBeanFactory beanFactory) {

    ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
            .configure()
            .constraintValidatorFactory(new SpringConstraintValidatorFactory(beanFactory))
            .buildValidatorFactory();

    return validatorFactory.getValidator();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...