Частично не срабатывает валидация данных
Господа спецы, подскажите, плиз, что не так с этим валидатором?
@Component
public class AccountValidator implements org.springframework.validation.Validator {
@Autowired
private Validator validator;
private final AccountService accountService;
public AccountValidator(@Qualifier("accountServiceAlias")AccountService accountService) {
this.accountService = accountService;
}
@Override
public boolean supports(Class<?> clazz) {
return AccountRequestDTO.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Set<ConstraintViolation<Object>> validates = validator.validate(target);
for (ConstraintViolation<Object> constraintViolation : validates) {
String propertyPath = constraintViolation.getPropertyPath().toString();
String message = constraintViolation.getMessage();
errors.rejectValue(propertyPath, "", message);
}
AccountRequestDTO account = (AccountRequestDTO) target;
if(accountService.getPhone(account.getPhone()).equals(account.getPhone())){
errors.rejectValue("phone", "", "Validator in action! This number is already in use.");
}
}
}
Вторая часть метода validate не срабатывает, процесс идёт дальше в сервис и там уже отлавливается ошибка БД:
public void saveAccount(AccountRequestDTO accountRequestDTO) throws Exception {
LocalDate birthday = LocalDate.parse(accountRequestDTO.getBirthday());
if (LocalDate.from(birthday).until(LocalDate.now(), ChronoUnit.YEARS) < 18) {
throw new RegistrationException("You must be 18+ to register");
}
Account account = new Account(accountRequestDTO.getName(), accountRequestDTO.getSurname(),
accountRequestDTO.getPhone(), birthday, BCrypt.hashpw
(accountRequestDTO.getPassword(), BCrypt.gensalt(4)));
account.addRole(Role.CLIENT);
try {
accountRepository.save(account);
}
catch (RuntimeException exc) {
throw new EntityExistsException("Database exception: this number is already in use.");
}
}
а идея как раз в том, чтобы обработать уникальность значения phone на уровне приложения.
Метод контроллера, где происходит вызов:
@PostMapping("/confirm")
public String signIn(@ModelAttribute("account") @Valid AccountRequestDTO accountRequestDTO,
BindingResult result, Model model) {
accountValidator.validate(accountRequestDTO, result);
if(result.hasErrors()) {
return "/auth/register";
}
try {
accountService.saveAccount(accountRequestDTO);
}
catch (Exception exc) {
model.addAttribute("message", exc.getMessage());
return "/auth/register";
}
return "/auth/login";
}
Метод сервиса:
@Transactional(readOnly = true)
public String getPhone(String phone){
return accountRepository.getPhone(phone);
}
в JpaRepository:
@Query("SELECT phone FROM Account accounts WHERE phone=:check")
String getPhone(String check);