我想在自定义验证器中使用其中一个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;
}
}