Witam, otóż mam następujący problem. Posiadam adnotację LoginExsistConstraint, którą wykorzystuję w walidacji ( sprawdzam czy login nie jest już zajęty)
@Documented
@Retention(RUNTIME)
@Target( FIELD)
@Constraint(validatedBy=LoginExistsConstraintValidator.class)
public @interface LoginExsistsConstraint {
String message() default "Login already exists";
Class[] groups() default {};
Class[] payload() default {};
}
oraz klasę implementującą ConstraintValidator
public class LoginExistsConstraintValidator implements ConstraintValidator<LoginExsistsConstraint, String> {
@Autowired
private UserRepository userRepository;
@Override
public boolean isValid(String login, ConstraintValidatorContext arg1) {
User findByLogin = userRepository.findUserByLogin(login);
return (findByLogin !=null)? false:true;
}
}
Teraz robi się ta ciekawsza część. Jeżeli waliduje za pomocą np. adnotacji @Valid
saveUpdateUser(@Valid @ModelAttribute(value="oldUser") User user,
BindingResult result, Model model)
to walidacja przebiega bez problemu. Jeżeli jednak chce przeprowadzić walidację tylko jednego pola (update użytkowanika) to pojawia się problem gdyż nie działa @Autowired i userRepository ma wartość null. Walidację jednego pola prowadzę w następujący sposób.
ConstraintValidatorFactory validator = Validation.buildDefaultValidatorFactory().getConstraintValidatorFactory();
LoginExistsConstraintValidator instance = validator.getInstance(LoginExistsConstraintValidator.class);
boolean valid = instance.isValid(user.getLogin(), null);
Przeszukałem już cały stack i wykorzystałem wszystkie triki jakie proponują ( łącznie z wywołaniem w metodzie initialize metody SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); ) ale dalej jest ten sam problem. Może ktoś z was wie czemu ten @Autowired nie działa gdy przeprowadzam walidację tylko jednego pola lub gdzie w mojej walidacji zrobiłem błąd.