我正在使用用戶註冊表單處理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