Задать вопрос
@Lopus

Как правильно спроектировать обработку ошибок в слоях?

Делаю запрос GET /api/news/5 и ожидаю получить json с данными по id=5.

Получаю id в контроллере, через сервис передаю в репозиторий.
Репозиторий возвращает Optional.
Сервис проверяет, если newsEntityOptional.isEmpty(), то пишет logger.warn и выбрасывает исключение javassist.NotFoundException.
Контроллер выбрасывает это исключение выше.

Вопрос в том, на каком слое правильней выбрасывать исключение? Может стоит вернуть Optional в контроллер или наоборот пробросить исключение аж из самого репозитория?
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Java-разработчик
    10 месяцев
    Далее
  • Skillfactory
    Профессия Java-разработчик
    14 месяцев
    Далее
  • Нетология
    Java-разработчик с нуля
    12 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 2
Репозиторий может иметь методы find() — возвращает Optional
а может иметь get() — возвращает или нужный объект или исключение, которе может лететь дальше или перехвачено контроллером и выброшено дальше

на уровне контроллера норм перехватывать исключения, даже если дальше есть глобальный ErrorHandler
Ответ написан
Комментировать
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Добрый день.
Я предпочитаю делать это следующим образом.
На уровне репозитория (FooRepository) получаю Optional<Foo>. Далее на сервисном уровне (FooServiceImpl), который дублирует метод репозитория получаю уже Foo или в случае его отсутствия выбрасываю кастомное исключение FooNotFoundException. Затем некий глобальный ControllerAdvice ловит это исключение и возвращает http статус 404 с кастомным текстом Foo Not Found.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы