@RequestBody и @ResponseBody annotations весной

Может ли кто-нибудь объяснить annotations @RequestBody и @ResponseBody в Spring 3? Для чего они? Любые примеры были бы замечательными.

Существует целый раздел в документах 16.3.3.4. Сопоставление тела запроса с аннотацией @RequestBody . И один из них называется 16.3.3.5. Сопоставление тела ответа с аннотацией @ResponseBody . Я предлагаю вам ознакомиться с этими разделами. Также уместно: @RequestBody javadocs, @ResponseBody javadocs

Примеры использования будут примерно такими:

Используя JavaScript-библиотеку, такую ​​как JQuery, вы должны разместить JSON-Object следующим образом:

 { "firstName" : "Elmer", "lastName" : "Fudd" } 

Ваш метод controllerа будет выглядеть так:

 // controller @ResponseBody @RequestMapping("/description") public Description getDescription(@RequestBody UserStats stats){ return new Description(stats.getFirstName() + " " + stats.getLastname() + " hates wacky wabbits"); } // domain / value objects public class UserStats{ private String firstName; private String lastName; // + getters, setters } public class Description{ private String description; // + getters, setters, constructor } 

Теперь, если у вас есть Jackson на вашем пути к classам (и есть установка ), Spring преобразует входящий JSON в объект UserStats из тела сообщения (потому что вы добавили аннотацию @RequestBody ), и она будет сериализовать возвратил объект JSON (потому что вы добавили аннотацию @ResponseBody ). Таким образом, браузер / клиент увидит этот результат JSON:

 { "description" : "Elmer Fudd hates wacky wabbits" } 

См. Предыдущий мой ответ для полного рабочего примера: https://stackoverflow.com/a/5908632/342852

Примечание: RequestBody / ResponseBody, конечно, не ограничивается JSON, оба могут обрабатывать несколько форматов, включая простой текст и XML, но JSON, вероятно, является наиболее используемым форматом.


Обновление: с Spring 4.x вы обычно не будете использовать @ResponseBody на уровне метода, а скорее @RestController на уровне classа, с тем же эффектом. См. Раздел Создание controllerов REST с помощью annotations @RestController.

@RequestBody : аннотация, указывающая параметр метода, должна быть привязана к телу HTTP-запроса.

Например:

 @RequestMapping(path = "/something", method = RequestMethod.PUT) public void handle(@RequestBody String body, Writer writer) throws IOException { writer.write(body); } 

Аннотацию @ResponseBody можно поместить в метод и указывает, что тип возврата должен быть записан прямо в тело ответа HTTP (и не помещен в модель или не интерпретирован как имя вида).

Например:

 @RequestMapping(path = "/something", method = RequestMethod.PUT) public @ResponseBody String helloWorld() { return "Hello World"; } 

Кроме того, мы можем использовать аннотацию @RestController вместо annotations @Controller . Это устранит необходимость использования @ResponseBody .

Больше подробностей

 package com.programmingfree.springshop.controller; import java.util.List; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.programmingfree.springshop.dao.UserShop; import com.programmingfree.springshop.domain.User; @RestController @RequestMapping("/shop/user") public class SpringShopController { UserShop userShop=new UserShop(); @RequestMapping(value = "/{id}", method = RequestMethod.GET,headers="Accept=application/json") public User getUser(@PathVariable int id) { User user=userShop.getUserById(id); return user; } @RequestMapping(method = RequestMethod.GET,headers="Accept=application/json") public List getAllUsers() { List users=userShop.getAllUsers(); return users; } } 

В приведенном выше примере они собираются отображать все пользовательские и конкретные идентификационные данные, теперь я хочу использовать как id, так и имя,

1) localhost: 8093 / plejson / shop / user <--- эта ссылка будет отображать все данные пользователя
2) localhost: 8093 / plejson / shop / user / 11 <---- если я использую 11 в средстве ссылок, он отобразит конкретные данные пользователя 11

теперь я хочу использовать как id, так и имя

localhost: 8093 / plejson / shop / user / 11 / raju <----------------- как это означает, что мы можем использовать любой в этом, пожалуйста, помогите мне .... ,

Ниже приведен пример метода в controllerе Java.

 @RequestMapping(method = RequestMethod.POST) @ResponseBody public HttpStatus something(@RequestBody MyModel myModel) { return HttpStatus.OK; } 

Используя аннотацию @RequestBody, вы получите свои значения, сопоставленные с моделью, созданной в вашей системе, для обработки любого конкретного вызова. Хотя при использовании @ResponseBody вы можете отправить что-нибудь обратно в место, откуда был сгенерирован запрос. Обе вещи будут легко сопоставлены без написания пользовательского парсера и т. Д.

  • В Spring MVC, как я могу установить заголовок типа mime при использовании @ResponseBody
  • Почему это приложение Spring с настройкой на основе Java не работает должным образом
  • Параметр JSON весной MVC-controller
  • Каков наилучший способ получить текущий URL в Spring MVC?
  • UTF-8 в Spring MVC, проблема с формами FORM
  • сервер tomcat не запускает сервер и приложение в STS
  • Автообработка двух компонентов, реализующих один и тот же интерфейс - как установить бонус по умолчанию для автоустройства?
  • Что вызывает «java.lang.IllegalStateException: ни BindingResult, ни обычный целевой объект для bean name« command », ansible как атрибут запроса»?
  • Может ли кто-нибудь объяснить отображение сервлетов?
  • Spring Web MVC - проверка отдельных параметров запроса
  • Spring WebSocket @SendToSession: отправить сообщение на определенный сеанс
  • Давайте будем гением компьютера.