ユーザー登録フォームを使用して Spring MVC + Hibernate + JPA アプリに取り組んでおり、JSR-303 バリデーターを使用して、ユーザー名が DB に既に存在するかどうかを確認することにしました。
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 および this: hibernate validator without autowire が、誰かが以前にこれに遭遇したかどうか疑問に思っていました。バリデーターでデータベースにアクセスするために Bean を注入することはかなり一般的だと思います。
回避策として、null のチェックを追加しましたuserService
が、適切ではありません。
- これは予想される動作ですか?これらの検証は、呼び出す前に起動することが想定されてい
CrudRepository.save()
ますか? - 「手動で」休止状態のイベントを処理することになっていますか? この場合
pre-insert