我已经在Spring Boot应用程序中创建了注释约束。它检查提供的电子邮件是否存在于users表中。该约束为@autowired字段提供了NullPointerException。
据我了解,验证器第一次由spring调用,第二次由休眠模式调用。当spring调用验证程序时,@autowired字段将被成功注入。当它被休眠调用时,注入的值始终为null。我尝试通过字段注入和按构造函数进行操作。
UniqueEmail.java
@Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE, TYPE_USE})
@Retention(RUNTIME)
@Constraint(validatedBy = UniqueEmailValidator.class)
@Documented
public @interface UniqueEmail {
String message() default "{validation.user.email.email_exists}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
UniqueEmailValidator.java
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {
@Autowired
private UserRepository userRepository;
@Override
public boolean isValid(String email, ConstraintValidatorContext constraintContext) {
return email != null && !userRepository.existsByEmail(email);
}
}
我将这些bean用于配置了messageSource的验证器
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
public LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
bean.setValidationMessageSource(messageSource());
return bean;
}
这是我的API端点
@PostMapping("/sign-up")
public void signUp(@Valid @RequestBody User user) {
// other user details related code ...
userRepository.save(user);
}
如果我禁用休眠验证器,则实体保存有效。但我想保留它。我也尝试将验证器bean设置为MethodValidationPostProcessor,但仍然无法正常工作。将存储库注入到验证器的正确方法是什么?没有一种解决方案有效。