Перейти к основному содержимому

Рендеринг исключений в JSON с помощью Spring

· 2 мин. чтения

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, поэтому его легко импортировать и запускать как есть.