Должен ли я предоставить специфичные для слоя исключения в REST Api с поддержкой SpringBoot? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть REST Api на основе SpringBoot, структурированный следующим образом:

Rest Controller -> Service -> Repository

и мне интересно, как именно обрабатывать исключения "правильно".

Например, скажем, кто-то вызывает конечную точку / myresources / {id} с несуществующим {id}. Вызов делегируется службе, которая в свою очередь пытается получить MyResource из репозитория. Это терпит неудачу и возвращает ноль. Затем служба генерирует исключение MyResourceNotFoundException.

Теперь мне нужен определенный формат для моих ошибок REST, поэтому у меня есть @ControllerAdvice ResponseEntityExceptionHandler, который обрабатывает пользовательскую сериализацию этих исключений (@ExceptionHandler (MyResourceNotFoundException.class)).

Fine.

Но это приведет к большой обработке / переводу для каждого отдельного пользовательского исключения. Поэтому я подумал, что мог бы это обобщить, добавив коды и сообщения HttpStatus в базовый абстрактный класс исключений, который MyResourceNotFound и другие будут расширять и переопределять. Таким образом, ResponseEntityExceptionHandler будет просто обрабатывать создание моей пользовательской ошибки DTO стандартным способом.

Но потом я понял, что добавляю концепции REST к исключению, выдаваемому на уровне обслуживания. Они не должны знать о таких понятиях ...

Может быть, мне следует перехватить исключение MyResourceNotFoundException в контроллере и выдать еще одно исключение, относящееся к слою, которое содержит соответствующие сообщения, HttpStatus и т. Д., Чтобы обработать это в общем случае в ResponseEntityExceptionHandler ...

Что вы думаете об этом?

1 Ответ

0 голосов
/ 11 апреля 2019

Вы можете обобщить исключение как XYZMicroserviceException.


class XYZGenericException extends Exception{
    String message;
   custom error details....


    XYZgenericException(errorMessage,   custom error Details..){
      this.message=errorMessage;
      .......
  }   
}

и вы можете окружить подозрительный вызов, который приведет к исключению, с помощью блока try и вызвать общее исключение в блоке catch, которое может быть обработано в глобальном исключенииобработчик.

   try{
        xyz.abcMethod() // may give some exception
      }
    catch(Exception e){
    throw new XYZGenericException(.........)
     }





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