[英]Use Spring dependency injection on a custom Hibernate validator
[英]Spring Custom Validator Injection NullPointerException
嘗試使用Spring定義自定義約束驗證時遇到問題。
我的代碼可以在我的GitHub上找到 。
這里的問題。 我有一個具有登錄驗證約束的實體:
@Entity
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
@UniqueLogin
private String login;
[...]
}
這是注釋定義:
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = UniqueLoginValidator.class)
public @interface UniqueLogin {
String message() default "{loginIsNotUnique}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
還有自定義驗證器:
public class UniqueLoginValidator implements ConstraintValidator<UniqueLogin, String> {
@Autowired
private UserRepository userRepository;
public boolean isValid(String login, ConstraintValidatorContext context) {
return userRepository.countByLogin(login) == 0;
}
}
當我調用repository.save(new User("Kim"));
,我得到了一個NullPointerException
上注入userRepository
的UniqueLoginValidator
。
我認為Spring可以正確注入自定義驗證器,我必須告訴他。 但是,我不知道如何。 我已經嘗試過通過Stack Overflow和Google找到的一些東西,但是沒有運氣。
任何幫助將不勝感激。
經過幾次搜索和討論之后,將bean注入Bean Validation Constraint似乎不是一個好習慣。
這就是為什么Hibernate上下文不了解Spring上下文的原因。
我有類似的問題, 但是我能夠在自定義驗證器中注入Spring Bean 。
Spring框架自動檢測實現ConstraintValidator
接口的所有類,實例化它們,並連接所有依賴項。
我正在使用Spring Boot 2.0。 注意UniqueFieldValidator
不使用任何Spring bean注釋進行注釋
樣例代碼
public class UniqueFieldValidator implements ConstraintValidator<UniqueField, Person> {
@Autowired
PersionList personRepository;
@Override
public boolean isValid(Person object, ConstraintValidatorContext context) {
log.info("Validating Person for Duplicate {}",object);
return personRepository.isPresent(object);
}
}
@Documented
@Constraint(validatedBy = UniqueFieldValidator.class)
@Target({ ElementType.METHOD,ElementType.ANNOTATION_TYPE,ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueField {
String message() default "Duplicate Name";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
用法
@Component
@Validated
public class PersonService {
@Autowired
PersionList personRepository;
public void addPerson(@UniqueField Person person) {
personRepository.add(person);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.