Подробное руководство: @RequestBody и @ResponseBody в Spring 3

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Аннотация @RequestBody осуществляет преобразование входящего JSON/XML в объект Java, что актуально преимущественно для POST-запросов. А @ResponseBody обратно превращает объект Java в JSON/XML для ответа, что идеально подходит для GET-запросов.

Пример использования @RequestBody:

Java
Скопировать код
@PostMapping("/items")
public Item recruitItem(@RequestBody Item item) {
    return service.save(item);
}

Пример использования @ResponseBody:

Java
Скопировать код
@GetMapping("/items/{id}")
public @ResponseBody Item checkItem(@PathVariable Long id) {
    return service.findById(id);
}

Эти аннотации являются ключевыми для создания качественных RESTful-сервисов на Spring.

Кинга Идем в IT: пошаговый план для смены профессии

Разгадываем загадку аннотаций

Обработка входных данных с помощью @RequestBody

@RequestBody облегчает работу со сложными структурами JSON, анализируя входящие данные и преобразуя их в параметры метода. Благодаря этому мы можем использовать все преимущества изощренной объектной модели, избегая непосредственного взаимодействия с HTTP-телом запроса.

Java
Скопировать код
@PostMapping("/events")
public Event registerEvent(@RequestBody Event event) {
    return eventService.save(event);
}

Процесс десериализации в Spring можно настроить с использованием Jackson для работы с сложными данными, включая их форматы.

Создание выходных данных с @ResponseBody

@ResponseBody точно формирует JSON-ответ, предоставляя возможности для разнообразного форматирования и добавления метаданных.

Java
Скопировать код
@GetMapping("/items/summary")
public @ResponseBody ItemSummary getSummary(@PathVariable Long id) {
    return service.findSummaryById(id);
}

Для детализированной настройки JSON можно воспользоваться инструментами типа @JsonView.

Упрощаем REST с помощью @RestController

Аннотация @RestController значительно облегчает создание REST API, делая использование @ResponseBody в каждом методе контроллера излишним.

Java
Скопировать код
@RestController
@RequestMapping("/users")
public class UserController {
    // Контроллер готов к работе
}

Чтобы трансформировать Spring MVC-приложение в REST-сервис, достаточно использовать @RestController.

Стратегии обработки ошибок и лучшие практики

Распространенные ошибки

Использование @RequestBody может вызвать проблемы с десериализацией, если в классе отсутствует конструктор без аргументов.

Java
Скопировать код
public class User {
    public User() {}
    // Определения полей и методы доступа
}

Отсутствие сеттеров также может стать причиной ошибок связывания при работе Jackson.

Как справиться с сериализацией и десериализацией JSON

С помощью аннотаций Jackson можно точно сопоставлять JSON и поля Java, ограждая себя от проблем с именованием переменных.

Java
Скопировать код
public class User {
    @JsonProperty("user_name")
    private String username;
    @JsonAlias({"email", "email_address"})
    private String emailAddress;
    // Дополнительные свойства, геттеры и сеттеры
}

Создание HTTP заголовков ответа

При использовании ResponseEntity мы можем полностью контролировать HTTP-ответ, включая заголовки и статусные коды.

Java
Скопировать код
@GetMapping("/items/{id}")
public ResponseEntity<Item> getItem(@PathVariable Long id) {
    Item item = service.findById(id);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    return new ResponseEntity<>(item, headers, HttpStatus.OK);
}

Визуализация

@RequestBody и @ResponseBody можно представить как работников на складе: первый распаковывает данные, второй их упаковывает перед отправкой.

@RequestBody = Команда Трансформации

@ResponseBody = Подразделение Упаковки

Суть проста: данные приходят и уходят, процесс обмена информацией максимально упрощен.

Практическое руководство: Применение аннотаций

Использование HTTP статус-кодов

Сочетая @ResponseStatus с @ResponseBody, можно делать ответы информативнее благодаря HTTP-статусам.

Java
Скопировать код
@PostMapping("/users")
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody User createUser(@RequestBody User user) {
    return userService.save(user);
}

Встречайте ResponseEntity, контролирующего манипулятора

ResponseEntity предоставляет больше возможностей для формирования ответа, чем @ResponseBody.

Java
Скопировать код
@PostMapping("/tasks")
public ResponseEntity<Task> addTask(@RequestBody Task task) {
    Task createdTask = taskService.save(task);
    return ResponseEntity
            .status(HttpStatus.CREATED)
            .body(createdTask);
}

Переговоры с применением Содержательного Согласования

Содержательное согласование помогает управлять форматом ответа, используя HTTP-конвертеры для различных типов данных.

Java
Скопировать код
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
   @Override
   public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
       converters.add(new MappingJackson2HttpMessageConverter());
       converters.add(new MarshallingHttpMessageConverter());
   }
}

Это позволяет поддерживать множество форматов данных в RESTful API.

Полезные материалы

  1. Официальная документация Spring MVC для @RequestBody – подробное руководство по аннотации @RequestBody.
  2. Официальная документация Spring MVC для @ResponseBody – подробное руководство по аннотации @ResponseBody.
  3. Пример использования @RequestBody в Spring – практическое применение @RequestBody.
  4. Пример использования @ResponseBody в Spring – практическое применение @ResponseBody.
  5. Учебное видео о @RequestBody и @ResponseBody в Spring на YouTube – видеоурок по аннотациям @RequestBody и @ResponseBody.
  6. Пример REST-приложения на Spring Boot с @RequestBody и @ResponseBody – использование @RequestBody и @ResponseBody в контексте Spring Boot.
Свежие материалы