首页 > 解决方案 > Spring Boot with Validation - 在自定义验证器中注入存储库给出 Null

问题描述

虽然我发现了一些类似的问题(例如这里这里),但它并没有完全回答我的问题,因为我使用的是 spring Boot 2.4.4,或者根本不起作用。我的问题是存储库null在第二次(JPA)验证期间变为。这是详细信息:

我通过spring-boot-starter-validation dependency. 我有一个自定义验证器来检查数据库中是否存在电子邮件。首先我声明@EmailExisting注释:

@Documented
@Constraint(validatedBy = EmailValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface EmailExisting {
    String message() default "Email already exists";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

然后是自定义验证器,注入存储库以检查数据库:

public class EmailValidator implements
        ConstraintValidator<EmailExisting, String> {

    @Autowired
    UserRepository userRepository;

    @Override
    public boolean isValid(String email,
                           ConstraintValidatorContext cxt) {
        List<User> users = userRepository.findByEmail(email);
        if (!users.isEmpty()) {
            return false;
        }
        return true;
    }
}

最后是 SPRING MVC 部分,带有@Valid用于触发验证的注释:

    @Autowired
    UserRepository userRepository;

    @PostMapping(value = "/users")
    public ResponseEntity addUSer(@Valid @RequestBody User user) {

        user.setEmail(user.getEmail());
        user.setLastName(StringUtils.capitalize(user.getLastName()));
        user.setFirstName(StringUtils.capitalize(user.getFirstName()));
        userRepository.save(user);

        return new ResponseEntity(user, HttpStatus.CREATED);
    }

问题:当我测试端点时,我有一个NullPointerException. 首先,在 MVC 验证期间,存储库被正确注入。但是之后,当我们调用save()方法将实体保存在控制器中时,控件再次触发,存储库变为null,因此NullPointerException.

我找到了一种解决方法,使用以下配置停用 JPA 端的控制: spring.jpa.properties.javax.persistence.validation.mode=none

它运作良好,但我认为应该可以在 2 种情况下注入存储库?

所有代码都在我的存储库中

先感谢您!

标签: spring-bootvalidationspring-data

解决方案


推荐阅读