spring-boot - 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 种情况下注入存储库?
所有代码都在我的存储库中
先感谢您!
解决方案
推荐阅读
- python - 如何在python中使用pyqt5将QSlider添加到主窗口的工具栏
- c - 如何在 C 命令行中采用逗号分隔的输入参数?
- vba - 如何修复从 32 位转换的 64 位 VBA PPT 的错误
- javascript - 不同的边界半径
- python - Keras 中的 VAE:如何定义端到端模型?
- python - quandl FXH1 下载数据
- javascript - 函数声明以及它们如何在当前范围内创建变量
- sql - 插入外键时出现语法错误
- java - Dropwizard仪表频率
- javascript - 带有 ui.bootstrap 的 Angularjs 和 jquery.datatable - 需要使用循环在 json 中显示条目