![](/img/trans.png)
[英]Cannot use @Autowired within ConstraintValidator - gives NPE
[英]How to use @Autowired inside a ConstraintValidator?
是否可以在嵌套到@interface
的ConstraintValidator
中使用依賴注入?
我創建了需要驗證一些數據的自定義注釋。
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.