我正在开发带有用户注册表单的 Spring MVC + Hibernate + JPA 应用程序,我决定使用 JSR-303 验证器来检查数据库中是否已经存在用户名:
public class UniqueUsernameValidator implements ConstraintValidator<VerifyUniqueUsername, String> {
@Autowired
UserService userService;
@Override
public void initialize(VerifyUniqueUsername constraintAnnotation) {
}
@Override
public boolean isValid(String username, ConstraintValidatorContext context) {
return username!=null && userService.findByUsername(username) == null;
}
}
这非常简单,并且验证在我的控制器上效果很好:
....
public String signup(@Valid @ModelAttribute("newUser") User user, BindingResult newUserBeanResult)
.....
我目前面临的问题是,在我User
验证了我的对象并调用之后:
userService.save(user);
哪个实现CrudRepository
,我得到一个NullPointerException
。由于某种原因UserService
,在控制器上的验证过程中被注入,但在我调用CrudRepository.save()
.
我看到了类似的帖子,例如: @Autowired bean null in ConstraintValidator when called by Sessionfactory.getCurrentSession.merge 和 this: hibernate validator without using autowire 但我想知道是否有人以前遇到过这个问题。我认为注入 bean 以访问验证器上的数据库是相当普遍的。
作为一种解决方法,我添加了对 null 的检查,userService
但感觉不对。
- 这是预期的行为吗?这些验证是否应该在调用之前触发
CrudRepository.save()
? - 我应该处理“手动”休眠事件吗?在这种情况下
pre-insert