Обработка исключения нарушения ограничения в сервисе Spring Data JPA RESTful - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь отправить пользовательское сообщение клиенту, когда на уровне данных возникает исключение нарушения ограничения. В частности, когда автор с тем же именем сохраняется, Hibernate выбрасывает org.hibernate.exception.ConstraintViolationException, вплоть до моего метода обслуживания:

public Author save(Author author) { return authorRepository.save(author); }

, где authorRepository - JpaRepository , Я мог бы обработать исключение в @ControllerAdvice, который расширяет ResponseEntityExceptionHandler, например:

// TODO: Don't propagate, handle at service layer!
@ExceptionHandler(org.hibernate.exception.ConstraintViolationException.class)
public void handleSQLException(
        HttpServletResponse response, ConstraintViolationException ex) throws IOException {
    response.sendError(HttpStatus.SEE_OTHER.value(), ex.getMessage());
}

Проблема с этим подходом состоит в том, что я не хочу распространять исключение уровня данных непосредственно на клиент, а скорее использую пользовательское исключение, которое я делаю в случае «исключение автора не найдено»:

public Author findById(Long id) {
    return authorRepository.findById(id)
            .orElseThrow(() -> new AuthorNotFoundException(id));
}

Должен ли я перехватить ошибку в службе или контроллере и выдать пользовательское исключение, которое будет обработано советом контроллера? Каковы лучшие практики для этого сценария?
Я не смог найти хороших примеров того, как обрабатывать ошибки базы данных и правильно их переносить для ответов REST.
Любая помощь будет принята с благодарностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...