Как обрабатывать исключение в контроллере для Spring Boot REST API?

Я не понимаю, как мне обрабатывать исключение контроллера в Spring Boot Rest API. Прямо сейчас я выбрасываю некоторые исключения в своих классах обслуживания, например:

public Optional<Item> getSpecificItem(Long itemId) throws Exception {

    return Optional.ofNullable(itemRepository.findById(itemId).
            orElseThrow(() -> new Exception("Item with that id doesn't exist")));
}

Я не знаю, правильный ли это способ сделать это, но он работает, я открыт для критики. Что касается классов контроллеров, я не знаю, как это должно выглядеть, я видел пример с @ControllerAdvice и исключениями для каждого контроллера, и мне это показалось плохим. Могу ли я иметь глобальный класс исключений для всех контроллеров? Это хорошая практика?

Видел несколько примеров, и я не знаю, были ли они правильным способом сделать это.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@ControllerAdvice хорошо, если вы не используете для общего исключения. Например, если вы определяете исключение спецификации, такое как SkyIsRedException. Таким образом, он будет брошен везде, где он поймает.

@ControllerAdvice
public class ExampleAdvice {

    @ExceptionHandler(SkyIsRedException.class)
    @ResponseCode(HttpStatus.NOT_FOUND) // <- not required
    public void methodName1() { ... }

    @ExceptionHandler(SkyIsGreenException.class)
    public void methodName2() { ... }

}

И вы также можете это @ExceptionHandler в контроллере, так что он активируется, если какой-либо метод контроллера вызовет это SkyIsRedException.

Я не рекомендую использовать Exception для всего. Вы только вредите себе.


ОБНОВИТЬ:

// annotations
public class Controller {

    // annotations
    public Optional<Item> getSpecificItem(Long itemId) throws ItemNotExistException {
        return Optional.ofNullable(itemRepository.findById(itemId).
            orElseThrow(() -> new ItemNotExistException("Item with that id doesn't exist")));
    }

    // Controller specific exception handler, not central like @ControllerAdvice
    @ExceptionHandler(ItemNotExistException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public String itemNotExistExceptionHandler(ItemNotExistException ex) {
        return ex.getMessage(); // example
    {

}

Итак, когда я должен использовать Exception, в каких ситуациях?

Leobejj 29.11.2022 07:27

В моем пакете контроллера у меня обычно есть класс ControllerAdvice, удобный для обработки всех исключений в одном месте. По умолчанию вы должны просто добавить туда перехватчик исключений и, возможно, вернуть код ответа 500.

Johan Hendrik Ehlers 29.11.2022 08:26

Хорошее исключение для «Предмета с таким идентификатором не существует» называется NoSuchElementException. И вы можете указать подкатегории, такие как ItemNotExistException extends NoSuchElementException. И вы обрабатываете это исключение. Таким образом, вы можете отделить обработку ошибок. Я изменил исходный ответ.

Numichi 29.11.2022 12:11

Другие вопросы по теме