«1. Введение

Happy-path REST довольно хорошо понятен, и Spring упрощает его реализацию на Java.

Но что делать, если что-то пойдет не так?

В этом руководстве мы рассмотрим передачу исключения Java как часть ответа JSON с использованием Spring.

Для более широкого обзора ознакомьтесь с нашими сообщениями об обработке ошибок для REST с помощью Spring и создании глобального обработчика исключений Java.

2. Аннотированное решение

Мы собираемся использовать три основные аннотации Spring MVC, чтобы решить эту проблему:

    @RestControllerAdvice, который содержит @ControllerAdvice для регистрации окружающего класса как чего-то, о чем должен знать каждый @Controller, и @ResponseBody, чтобы указать Spring отображать ответ этого метода как JSON @ExceptionHandler, чтобы сообщить Spring, какой из наших методов следует вызывать для данного исключения

Вместе они создают bean-компонент Spring, который обрабатывает любые исключения, для которых мы его настраиваем. Вот более подробная информация об использовании @ControllerAdvice и @ExceptionHandler в сочетании.

3. Пример

Во-первых, давайте создадим произвольное пользовательское исключение для возврата клиенту:

public class CustomException extends RuntimeException {
    // constructors
}

Во-вторых, давайте определим класс для обработки исключения и передачи его клиенту в виде JSON: ~~ ~

@RestControllerAdvice
public class ErrorHandler {

    @ExceptionHandler(CustomException.class)
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public CustomException handleCustomException(CustomException ce) {
        return ce;
    }

}

Обратите внимание, что мы добавили аннотацию @ResponseStatus. Это будет указывать код состояния для отправки клиенту, в нашем случае это внутренняя ошибка сервера. Кроме того, @ResponseBody гарантирует, что объект будет отправлен обратно клиенту, сериализованным в JSON. Наконец, ниже приведен фиктивный контроллер, который показывает пример того, как может быть сгенерировано исключение:

@Controller
public class MainController {

    @GetMapping("/")
    public void index() throws CustomException {
        throw new CustomException();
    }

}

4. Заключение

В этом посте мы показали, как обрабатывать исключения в Spring. Более того, мы показали, как отправить их обратно клиенту сериализованными в JSON.

Полную реализацию этой статьи можно найти на Github. Это проект на основе Maven, поэтому его легко импортировать и запускать как есть.