4 ответов:
в документах есть целый раздел под названием 16.3.3.4 сопоставление тела запроса с аннотацией @RequestBody. И один позвал 16.3.3.5 сопоставление тела ответа с аннотацией @ResponseBody. Я предлагаю вам ознакомиться с этими разделами. Также актуально:
@RequestBodyjavadocs,@ResponseBodyjavadocsпримеры употребления будет что-то вроде этого:
используя JavaScript-библиотеку, такую как JQuery, вы разместил бы JSON-объект следующим образом:
{ "firstName" : "Elmer", "lastName" : "Fudd" }ваш метод контроллера будет выглядеть так:
// 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 }теперь, если у вас есть Джексон на вашем classpath (и есть
<mvc:annotation-driven>setup), Spring преобразует входящий JSON в объект UserStats из тела сообщения (потому что вы добавили@RequestBodyаннотация) и он будет сериализовать возвращенный объект в JSON (потому что вы добавили@ResponseBodyаннотация). Так что браузер / клиент будет смотрите этот результат JSON:{ "description" : "Elmer Fudd hates wacky wabbits" }см. этот мой предыдущий ответ для полного рабочего примера:https://stackoverflow.com/a/5908632/342852
Примечание: RequestBody / ResponseBody, конечно, не ограничивается JSON, оба могут обрабатывать несколько форматов, включая обычный текст и XML, но JSON, вероятно, наиболее часто используемый формат.
обновление: Начиная с весны 4.x, вы обычно не будете использовать
@ResponseBodyна уровне метода , но скорее@RestControllerна уровне класса, с тем же эффектом. Смотрите создание контроллеров REST с аннотацией @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 аннотация вместо
@ControllerПримечание. Это позволит удалить необходимость использования@ResponseBody.
Ниже приведен пример метода в контроллере Java.
@RequestMapping(method = RequestMethod.POST) @ResponseBody public HttpStatus something(@RequestBody MyModel myModel) { return HttpStatus.OK; }используя аннотацию @RequestBody, вы получите свои значения, сопоставленные с моделью, созданной в вашей системе для обработки любого конкретного вызова. В то время как с помощью @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<User> getAllUsers() { List<User> users=userShop.getAllUsers(); return users; } }в приведенном выше примере они будут отображать все данные пользователя и конкретного идентификатора теперь я хочу использовать как идентификатор, так и имя,
1) localhost:8093 / plejson / shop / user 2) локальный:8093/plejson/магазин/пользователей/11
теперь я хочу использовать как id, так и name
localhost:8093 / plejson / shop / user / 11 / raju
Comments