簡體   English   中英

如何在 ConstraintValidator 中使用 @Autowired?

[英]How to use @Autowired inside a ConstraintValidator?

是否可以在嵌套到@interfaceConstraintValidator中使用依賴注入?

我創建了需要驗證一些數據的自定義注釋。

CodebookValidator只是一個普通的@Component :它沒有用@Service ,@Component 注釋......但是即使我用@Service注釋它,DI 也不起作用......

關於如何在ConstraintValidator中使用@Autowired的任何想法? 這是代碼片段:

@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);
        }
    }
}

您可以為自己的Validator bean 提供 Spring 自動裝配功能:

@Bean
public Validator validator(final AutowireCapableBeanFactory beanFactory) {

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

    return validatorFactory.getValidator();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM