Обработка исключений

Базовый Spring
≈ 1 мин чтения

Ошибка Java должна стать понятным HTTP-ответом

Сервис может сообщить об ошибке исключением: например, запрошенный ресурс не найден. Если ничего не настроить, внутреннее исключение и внешний HTTP-контракт оказываются слишком тесно связаны. Spring MVC позволяет отдельно описать, как конкретная ошибка должна выглядеть для клиента.

@RestControllerAdvice
class ApiExceptionHandler {

    @ExceptionHandler(UserNotFoundException.class)
    ResponseEntity<ApiError> handle(UserNotFoundException ex) {
        return ResponseEntity.status(404)
                .body(new ApiError(ex.getMessage()));
    }
}

@ExceptionHandler связывает тип исключения с методом обработки. @RestControllerAdvice позволяет вынести такие методы из отдельных контроллеров и применять их к web-слою централизованно.

Почему централизованный обработчик полезен

Без общего слоя каждый controller начинает повторять одинаковые try/catch блоки и формировать ошибки по-своему. Advice позволяет держать один формат ошибки и единые правила соответствия между типичными исключениями и HTTP status.

Не отправляй клиенту внутренние детали исключения без необходимости. Stack trace, SQL-текст и служебные сообщения полезны в логах, но внешний API обычно должен возвращать стабильную и безопасную структуру ошибки.