@Lopus

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

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

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

Вопрос в том, на каком слое правильней выбрасывать исключение? Может стоит вернуть Optional в контроллер или наоборот пробросить исключение аж из самого репозитория?
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 2
Maksclub
@Maksclub
maksfedorov.ru
Репозиторий может иметь методы find() — возвращает Optional
а может иметь get() — возвращает или нужный объект или исключение, которе может лететь дальше или перехвачено контроллером и выброшено дальше

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

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

Войти через центр авторизации
Похожие вопросы