保存时,自动装配在Spring Boot休眠验证器中不起作用

时间:2019-07-18 14:40:55

标签: spring hibernate spring-boot spring-data-jpa

我已经在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,但仍然无法正常工作。将存储库注入到验证器的正确方法是什么?没有一种解决方案有效。

0 个答案:

没有答案