java - 如何在 ConstraintValidator 中使用 @Autowired?

标签 java spring spring-boot

是否可以在嵌套到 @interface 定义的 ConstraintValidator 中使用依赖注入(inject)?

我创建了需要验证一些数据的自定义注释。

CodebookValidator 只是一个普通的类:它没有用 @Service@Component 注释...但是 DI 没有即使我用 @Service 注释它也能工作...

知道如何在 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具有 Spring Autowiring 功能的 bean:

@Bean
public Validator validator(final AutowireCapableBeanFactory beanFactory) {

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

    return validatorFactory.getValidator();
}

关于java - 如何在 ConstraintValidator 中使用 @Autowired?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58379526/

相关文章:

java - 从java中的另一个项目访问包和类文件

java - 如何在特定的spring boot版本中使用不同的spring模块(spring-data-redis)版本

ItemWriter的Spring Batch跳过异常

java - GSON 需要 BEGIN_ARRAY 但实际是 BEGIN_OBJECT

java - Powermock:静态接口(interface)方法给出未完成的 stub 异常

java - 运行 spring 服务器时 JRebel-JVMTI 错误

spring - JPA 多对多 - 我是否必须从两个集合集中删除\添加?

java - Spring 执行器端点在应用程序端口上不起作用

spring - .war 文件部署在 tomcat 服务器中,但出现错误 404,资源不可用

java - Spring 集成测试消耗大量内存,在 GradleWorkerMain 中使用大量重复线程