#spring #rest #spring-mvc #exception
#spring #rest #spring-mvc #исключение
Вопрос:
У меня есть REST Api на основе SpringBoot, структурированный следующим образом :
Rest Controller -> Service -> Repository
и мне интересно, как именно обрабатывать исключения «правильно».
Например, допустим, кто-то вызывает конечную точку /myresources/{id} с несуществующим {id} . Вызов делегируется службе, которая, в свою очередь, пытается получить MyResource из репозитория. Он завершается с ошибкой и возвращает null. Затем служба выдает исключение MyResourceNotFoundException.
Теперь мне нужен определенный формат для моих ошибок REST, поэтому у меня есть @ControllerAdvice ResponseEntityExceptionHandler, который обрабатывает пользовательскую сериализацию этих исключений (@ExceptionHandler(MyResourceNotFoundException.class )).
Отлично.
Но это приведет к большой обработке / переводу для каждого отдельного пользовательского исключения. Поэтому я подумал, что могу обобщить это, добавив коды и сообщения HttpStatus в базовый абстрактный класс исключений, который MyResourceNotFound и другие будут расширять и переопределять. Таким образом, ResponseEntityExceptionHandler просто обработал бы создание моей пользовательской ошибки DTO стандартным способом.
Но потом я понял, что добавляю концепции REST к исключению, создаваемому на уровне сервиса. Они не должны знать о таких понятиях…
Может быть, мне следует перехватить исключение MyResourceNotFoundException в контроллере и создать другое исключение, зависящее от уровня, которое содержит соответствующие сообщения и HttpStatus и т. Д., Чтобы обработать это в общем случае в ResponseEntityExceptionHandler…
Что вы думаете по этому поводу?
Ответ №1:
Вы можете обобщить исключение как 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(.........)
}
In the exception handler class with @restcontrolleradvice you can annotate the methods with the type of specific exception class to be handled.