Я работаю над приложением Spring MVC + Hibernate + JPA с регистрационной формой пользователя и решил использовать валидатор JSR -303, чтобы проверить, существует ли уже имя пользователя в БД :
public class UniqueUsernameValidator implements ConstraintValidator {
@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 в ConstraintValidator при вызове Sessionfactory.getCurrentSession.merge и это: спящий валидатор без использования autowire но мне было интересно, сталкивался ли кто-нибудь с этим раньше. Я думаю, что внедрение bean-компонентов для доступа к базе данных на валидаторе довольно распространено.
В качестве обходного пути я добавил проверку на ноль в userService
, но это кажется мне неправильным.
CrudRepository.save()
?pre-insert