I'm working on a Spring MVC + Hibernate + JPA app with a user registration form and I decided to use a JSR-303 validator to check whether the username already existed in the 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;        
    }
}
It is very straightforward and validation worked great on my controller:
....
    public String signup(@Valid @ModelAttribute("newUser") User user, BindingResult newUserBeanResult)
.....
The current problem I'm facing is that after I get my User object validated and I call:
userService.save(user);
Which implements CrudRepository, I get a NullPointerException. For some reason UserService is injected during validation on the controller but not when I call CrudRepository.save().
I saw similar posts such as this: @Autowired bean null in ConstraintValidator when invoked by Sessionfactory.getCurrentSession.merge and this: hibernate validator without using autowire but I was wondering if someone has run into this before. I would think that injecting beans to access the database on a validator is fairly common.
As a workaround I added a check for null on userService but it doesn't feel right.
- Is this expected behaviour? Are these validations supossed to fire before calling CrudRepository.save()?
- Am I suppossed to handle "manually" hibernate events? In this case pre-insert
 
     
    