Подробное руководство: @RequestBody и @ResponseBody в Spring 3
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Аннотация @RequestBody осуществляет преобразование входящего JSON/XML в объект Java, что актуально преимущественно для POST-запросов. А @ResponseBody обратно превращает объект Java в JSON/XML для ответа, что идеально подходит для GET-запросов.
Пример использования @RequestBody:
@PostMapping("/items")
public Item recruitItem(@RequestBody Item item) {
return service.save(item);
}
Пример использования @ResponseBody:
@GetMapping("/items/{id}")
public @ResponseBody Item checkItem(@PathVariable Long id) {
return service.findById(id);
}
Эти аннотации являются ключевыми для создания качественных RESTful-сервисов на Spring.
Разгадываем загадку аннотаций
Обработка входных данных с помощью @RequestBody
@RequestBody облегчает работу со сложными структурами JSON, анализируя входящие данные и преобразуя их в параметры метода. Благодаря этому мы можем использовать все преимущества изощренной объектной модели, избегая непосредственного взаимодействия с HTTP-телом запроса.
@PostMapping("/events")
public Event registerEvent(@RequestBody Event event) {
return eventService.save(event);
}
Процесс десериализации в Spring можно настроить с использованием Jackson для работы с сложными данными, включая их форматы.
Создание выходных данных с @ResponseBody
@ResponseBody точно формирует JSON-ответ, предоставляя возможности для разнообразного форматирования и добавления метаданных.
@GetMapping("/items/summary")
public @ResponseBody ItemSummary getSummary(@PathVariable Long id) {
return service.findSummaryById(id);
}
Для детализированной настройки JSON можно воспользоваться инструментами типа @JsonView
.
Упрощаем REST с помощью @RestController
Аннотация @RestController значительно облегчает создание REST API, делая использование @ResponseBody в каждом методе контроллера излишним.
@RestController
@RequestMapping("/users")
public class UserController {
// Контроллер готов к работе
}
Чтобы трансформировать Spring MVC-приложение в REST-сервис, достаточно использовать @RestController.
Стратегии обработки ошибок и лучшие практики
Распространенные ошибки
Использование @RequestBody может вызвать проблемы с десериализацией, если в классе отсутствует конструктор без аргументов.
public class User {
public User() {}
// Определения полей и методы доступа
}
Отсутствие сеттеров также может стать причиной ошибок связывания при работе Jackson.
Как справиться с сериализацией и десериализацией JSON
С помощью аннотаций Jackson можно точно сопоставлять JSON и поля Java, ограждая себя от проблем с именованием переменных.
public class User {
@JsonProperty("user_name")
private String username;
@JsonAlias({"email", "email_address"})
private String emailAddress;
// Дополнительные свойства, геттеры и сеттеры
}
Создание HTTP заголовков ответа
При использовании ResponseEntity
мы можем полностью контролировать HTTP-ответ, включая заголовки и статусные коды.
@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-статусам.
@PostMapping("/users")
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody User createUser(@RequestBody User user) {
return userService.save(user);
}
Встречайте ResponseEntity, контролирующего манипулятора
ResponseEntity
предоставляет больше возможностей для формирования ответа, чем @ResponseBody.
@PostMapping("/tasks")
public ResponseEntity<Task> addTask(@RequestBody Task task) {
Task createdTask = taskService.save(task);
return ResponseEntity
.status(HttpStatus.CREATED)
.body(createdTask);
}
Переговоры с применением Содержательного Согласования
Содержательное согласование помогает управлять форматом ответа, используя HTTP-конвертеры для различных типов данных.
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
converters.add(new MarshallingHttpMessageConverter());
}
}
Это позволяет поддерживать множество форматов данных в RESTful API.
Полезные материалы
- Официальная документация Spring MVC для @RequestBody – подробное руководство по аннотации @RequestBody.
- Официальная документация Spring MVC для @ResponseBody – подробное руководство по аннотации @ResponseBody.
- Пример использования @RequestBody в Spring – практическое применение @RequestBody.
- Пример использования @ResponseBody в Spring – практическое применение @ResponseBody.
- Учебное видео о @RequestBody и @ResponseBody в Spring на YouTube – видеоурок по аннотациям @RequestBody и @ResponseBody.
- Пример REST-приложения на Spring Boot с @RequestBody и @ResponseBody – использование @RequestBody и @ResponseBody в контексте Spring Boot.