Тело запроса
Тема дорожной карты · Spring Boot
@RequestBody и @ResponseBody — аннотации Spring Boot, управляющие тем, как полезная нагрузка HTTP-запроса и ответа десериализуется и сериализуется в методе @RestController или @Controller. @RequestBody указывает Spring MVC считать тело HTTP-запроса — как правило, JSON или XML — и преобразовать его в Java-объект с помощью настроенного HttpMessageConverter, чаще всего MappingJackson2HttpMessageConverter Jackson, так что обработчик POST /orders может получить OrderRequest непосредственно как параметр метода. @ResponseBody выполняет обратное: сигнализирует о том, что возвращаемое значение метода контроллера должно быть сериализовано непосредственно в тело HTTP-ответа, а не интерпретироваться как имя представления — именно поэтому @RestController является удобным сокращением, мета-аннотирующим как @Controller, так и @ResponseBody на уровне класса. Обе аннотации интегрируются с Bean Validation, так что параметр @RequestBody @Valid CreateUserRequest body запускает проверку ограничений JSR-380 — на основе Hibernate Validator — перед выполнением тела метода, а MethodArgumentNotValidException преобразуется в ответ 400. Понимание @RequestBody и @ResponseBody обязательно для создания RESTful Spring Boot API, потребляемых фронтенд-приложениями, мобильными клиентами или другими Spring Boot-микросервисами, взаимодействующими по HTTP.
Как это работает
Тело запроса: 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 на ошибках).