Spring Boot: обработка ошибок

По умолчанию Spring Boot предоставляет отображение /error, которое разумным образом обрабатывает все ошибки и регистрируется как “global” страница ошибок в контейнере сервлета. Для машинных клиентов он генерирует ответ JSON с подробной информацией об ошибке, статусе HTTP и сообщении об исключении. Для клиентов браузера есть представление ошибок “whitelabel”, которое отображает те же данные в формате HTML (чтобы настроить его, добавьте View, который разрешает ошибку). Чтобы полностью заменить поведение по умолчанию, вы можете реализовать ErrorController и зарегистрировать определение компонента этого типа или добавить компонент типа ErrorAttributes, чтобы использовать существующий механизм, но заменить содержимое.

BasicErrorController может использоваться в качестве базового класса для пользовательского ErrorController. Это особенно полезно, если вы хотите добавить обработчик для нового типа контента (по умолчанию используется специальная обработка text/html и предоставление запасного варианта для всего остального). Для этого расширьте BasicErrorController, добавьте открытый метод с @RequestMapping, который имеет атрибут produces, и создайте bean-компонент нового типа.

Вы также можете определить класс, аннотированный @ControllerAdvice, чтобы настроить документ JSON для возврата для определенного контроллера и/или типа исключения, как показано в следующем примере:

@ControllerAdvice(basePackageClasses = AcmeController.class)
public class AcmeControllerAdvice extends ResponseEntityExceptionHandler {

    @ExceptionHandler(YourException.class)
    @ResponseBody
    ResponseEntity<?> handleControllerException(HttpServletRequest request, Throwable ex) {
        HttpStatus status = getStatus(request);
        return new ResponseEntity<>(new CustomErrorType(status.value(), ex.getMessage()), status);
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == null) {
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
        return HttpStatus.valueOf(statusCode);
    }

}

В предыдущем примере, если YourException генерируется контроллером, определенным в том же пакете, что и AcmeController, вместо представления ErrorAttributes используется представление JSON для CustomErrorType POJO.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки