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

Тема дорожной карты · Spring Boot

@ExceptionHandler и @ControllerAdvice — аннотации Spring Framework, используемые для реализации централизованной, единообразной обработки ошибок во всех эндпоинтах @RestController и @Controller в Spring Boot-приложении. @ExceptionHandler размещается на методе внутри контроллера или — что предпочтительнее — внутри класса @ControllerAdvice, чтобы перехватить конкретный тип исключения и вернуть структурированный HTTP-ответ об ошибке — как правило, ResponseEntity<ProblemDetail> или пользовательский DTO ошибки. @ControllerAdvice (или его составной вариант @RestControllerAdvice) выступает в роли глобального компонента обработки исключений, обнаруживаемого через @ComponentScan Spring Boot, что устраняет дублирующиеся блоки try-catch в отдельных контроллерах. Типичный паттерн сочетает @ExceptionHandler с классом ProblemDetail (RFC 7807, доступен с Spring 6 / Spring Boot 3) для формирования машиночитаемых сообщений об ошибках с полями type, title, status и detail. @ExceptionHandler и @ControllerAdvice также интегрируются со Spring Security для единообразной обработки AccessDeniedException и AuthenticationException и прозрачно работают как в Spring MVC, так и в реактивных приложениях Spring WebFlux.

Как это работает

Обработчик исключений: Spring MVC + REST. @RestController возвращает JSON (или что HttpMessageConverter выберет); @RequestMapping (или method-specific @GetMapping/@PostMapping) маппит URL → handler. @PathVariable для /users/{id}, @RequestParam для query string, @RequestBody для десериализации body. @Valid + Bean Validation (Jakarta Validation) проверяет input. @ControllerAdvice + @ExceptionHandler централизуют error → HTTP-response маппинг. Servlet-стек на Tomcat дефолт; переключайтесь на Jetty/Undertow через starter exclusions.

Когда применять

DTO на границе controller — никогда не экспортируйте JPA-сущности напрямую (утечка внутренней модели + lazy-loading issues). Централизуйте error handling в @ControllerAdvice — дублированный try/catch = технический долг. Валидация рано. OpenAPI (springdoc-openapi) для документации + генерации клиентов. Для high-throughput non-blocking — WebFlux, но только при реальной нужде.

Типичные ошибки

Ловушки Обработчик исключений: возврат JPA-сущностей (lazy-loading бьёт DB после закрытия транзакции → LazyInitializationException); нет валидации input (мусор лезет в service-слой); не используют @ControllerAdvice (error handling разбросан, неконсистентные ответы); игнор HTTP-семантики (200 на ошибках).

Связанные понятия

Полезные ресурсы