Частично не срабатывает валидация данных

Господа спецы, подскажите, плиз, что не так с этим валидатором?

@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);

Ответы (0 шт):