Обработка исключений REST API при загрузке Spring

Что такое исключение?

Исключение - это нежелательный или непредвиденный случай, который происходит во время выполнения программы, то есть во время выполнения, что приводит к остановке программы.

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

В Spring Boot есть много способов обработать исключение, но мы сосредоточимся на «Как обрабатывать исключение глобально для каждого API?».

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

@ControllerAdvice

@ControllerAdvice is a specialization of the @Component annotation which allows to handle exceptions across the whole application in one global handling component. It can be viewed as an interceptor of exceptions thrown by methods annotated with @RequestMapping and similar.

@ExceptionHandler

Annotation for handling exceptions in specific handler classes and/or handler methods.

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

errorMessage: The message that we want to display to the end user.
errorCode: Http Status Code
timestamp: Time when an exception is thrown

Теперь для каждого типа исключения нам нужно создать отдельные классы.

Общие варианты использования:

  • Несанкционированное исключение 401
  • Resource Not Found Exception 404
  • Ресурс уже существует / конфликт 409
  • Неверный запрос / особое исключение 400

Создайте классы

  • UnauthorizedException.java
/**
 * @author anuragdhunna
 */
public class UnauthorizedException extends RuntimeException {

    public UnauthorizedException(String message) {
        super(message);
    }

}
  • ResourceNotFoundException.java
/**
 * @author anuragdhunna 
 */

public class ResourceNotFoundException extends RuntimeException {

    public ResourceNotFoundException(String message) {
        super(message);
    }

}
  • ResourceAlreadyExists.java
/**
 * @author anuragdhunna 
 */
public class ResourceAlreadyExists extends RuntimeException {

    public ResourceAlreadyExists(String message) {
        super(message);
    }
}
  • CustomException.java
/**
 * @author anuragdhunna 
 */
public class CustomException extends RuntimeException {

    public CustomException(String message) { super(message); }

}

Теперь давайте создадим глобальный класс обработки исключений с помощью @ControllerAdvice.

Теперь все исключения обрабатываются через GlobalExceptionHandle r.

Давайте проверим это:

Создайте метод в любом контроллере по вашему выбору:

@RequestMapping(value = "/testExceptionHandling", 
method = RequestMethod.GET)
public String testExceptionHandling(@RequestParam int code) {
    switch (code) {
        case 401:
            throw new UnauthorizedException("You are not authorized");
        case 404:
            throw new ResourceNotFoundException("Requested resource is not found.");
        case 400:
            throw new CustomException("Please provide resource id.");
        case 409:
            throw new ResourceAlreadyExists("Resource already exists in DB.");

        default:
            return "Yeah...No Exception.";

    }
}

API:

http://localhost:5000/api/testExceptionHandling?code=401

Ответ:

{
 "errorMessage": "You are not authorized",
 "errorCode": "UNAUTHORIZED",
 "timestamp": "14-06-2020 04:51:13"
}

Прежде чем ты уйдешь…

Если вам понравилась ❤ эта статья, нажмите 👏 хлоп.

Если вы знаете кого-то, кто может извлекать выгоду, пожалуйста, поделитесь. Я буду искать ваше мнение и предложения в комментариях, отзывы всегда приветствуются.