我正在使用用户注册表单处理Spring MVC + Hibernate + JPA应用程序,并决定使用JSR-303验证程序来检查用户名已经存在于DB:@Autowired bean与@Valid在控制器上工作,但与CRUD存储库失败
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 invoked by Sessionfactory.getCurrentSession.merge 这: hibernate validator without using autowire 但如果有人以前碰到这个我不知道。我认为注入bean来访问验证器上的数据库是相当普遍的。
作为一种解决方法,我在userService
上添加了一个空值检查,但它感觉不对。
- 这是预期的行为?在致电
CrudRepository.save()
之前,这些验证是否已被触发? - 我支持处理“手动”休眠事件吗?在这种情况下,
pre-insert
感谢您的建议,我对Spring相当陌生我会为@Configurable做一些Google搜索并回复给大家。谢谢。 – Ulises 2012-07-15 21:45:56
我没有太多的运气,如果你能指点我的地方,我可以阅读更多关于这将是伟大的。谢谢! – Ulises 2012-07-15 22:34:51
http://stackoverflow.com/questions/4703206/spring-autowiring-using-configurable - 这个问题有更多的细节如何设置@Configurable。它用于实体 - 同样也适用于验证器。 – gkamal 2012-07-17 16:41:29