@RestController

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

@RestController — это стереотипная аннотация Spring Boot, объединяющая @Controller и @ResponseBody, которая помечает класс как компонент веб-слоя, методы-обработчики которого записывают возвращаемые значения непосредственно в тело HTTP-ответа, а не передают их резолверу представления. Каждый метод в @RestController автоматически использует конвейер согласования контента и HttpMessageConverter Spring MVC, поэтому возврат Java-объекта сериализует его в JSON через Jackson без дополнительных аннотаций на каждом методе. Классы @RestController обнаруживаются через @ComponentScan Spring Boot, регистрируются в DispatcherServlet и могут быть сопоставлены через @RequestMapping, @GetMapping, @PostMapping, @PutMapping и @DeleteMapping для моделирования полного жизненного цикла RESTful-ресурса. Spring Security применяет правила SecurityFilterChain перед тем, как запросы достигают @RestController, обеспечивая проверку JWT или Bearer-токена OAuth2 на веб-уровне, тогда как @ControllerAdvice с @ExceptionHandler обеспечивает централизованную обработку ошибок для всех классов @RestController в приложении. Изолированное тестирование @RestController просто с помощью @WebMvcTest, который загружает только веб-срез контекста Spring Boot и предоставляет бин MockMvc для проверки HTTP-кодов состояния, тел ответов и значений заголовков без запуска полного сервера.

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

@RestController: 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, но только при реальной нужде.

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

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

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

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