我在尝试使用 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 {};
}
还有自定义 validator :
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"));
时,我在 UniqueLoginValidator
的注入(inject) userRepository
上遇到了 NullPointerException
。
我认为 Spring 能够正确注入(inject)自定义 validator ,我必须告诉他。但是,我不知道怎么办。我已经尝试过通过 Stack Overflow 和 Google 找到的一些东西,但没有成功。
任何帮助将不胜感激。
最佳答案
我遇到了类似的问题,但我能够在自定义 validator 中注入(inject) Spring Bean。
Spring 框架自动检测所有实现 ConstraintValidator
接口(interface)的类,实例化它们,并连接所有依赖项。
我正在使用 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);
}
}
关于java - Spring自定义 validator 注入(inject)NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48258441/