Компонент @Autowired работает с @Valid на контроллере, но не работает с репозиторием CRUD

Я работаю над приложением 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, но это кажется мне неправильным.

  1. Это ожидаемое поведение? Предполагается ли, что эти проверки срабатывают перед вызовом CrudRepository.save()?
  2. Должен ли я обрабатывать события гибернации «вручную»? В этом случаеpre-insert

8
задан Community 23 May 2017 в 10:28
поделиться