Я пытаюсь отправить пользовательское сообщение клиенту, когда на уровне данных возникает исключение нарушения ограничения. В частности, когда автор с тем же именем сохраняется, 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.
Любая помощь будет принята с благодарностью.