将bean注入自定义验证器

时间:2019-07-29 14:34:11

标签: spring-boot validation

我想在自定义验证器中使用其中一个bean,但对于自动装配字段,始终保持为空。

我发现此链接https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#validation-beanvalidation-spring-constraints似乎是在谈论我打算做什么。

“默认情况下,LocalValidatorFactoryBean配置一个Spring的SpringConstraintValidatorFactory来创建ConstraintValidator实例。这使您的自定义ConstraintValidator像其他任何Spring bean一样受益于依赖项注入。”

本段使我认为它应该开箱即用(默认情况下)

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = CompanyValidator.class)
public @interface ValidCompany {
    String message() default "Invalid company.";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;

public class CompanyValidator implements ConstraintValidator<ValidCompany, Long> {

    @Autowired
    private IdentityClient identityClient;

    public void initialize(ValidCompany constraint) {}

    public boolean isValid(@Valid Long value, ConstraintValidatorContext context) {
        return identityClient.getCompany(value).getContent() != null;
    }

}

IdentityClient是我要注入的bean。通过FeignClient,验证程序可以访问远程API,以验证提供的公司ID是否存在。

有什么想法吗?

编辑: 我尝试了以下行为,但没有任何行为改变:

@Configuration
public class ValidationConfig {

    @Bean
    public Validator validator() {
        return new LocalValidatorFactoryBean();
    }

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor mvpp = new MethodValidationPostProcessor();
        mvpp.setValidator(validator());
        return mvpp;
    }

}

0 个答案:

没有答案