Відповіді:
У Документах є цілий Розділ під назвою 16.3.3.4 Картографування тіла запиту з анотацією @RequestBody . І називається 16.3.3.5 Картографування тіла відповідей з анотацією @ResponseBody . Я пропоную вам проконсультуватися з цими розділами. Також актуально: @RequestBody
javadocs, @ResponseBody
javadocs
Приклади використання були б приблизно подібними:
Використовуючи бібліотеку 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
}
Тепер, якщо у вас є Jackson на своєму classpath (і у вас є <mvc:annotation-driven>
налаштування), 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
на рівні класу, з тим же ефектом.
Ось цитата з офіційної весняної документації MVC :
@RestController
це складається анотацію , що саме по собі мета-анотований з@Controller
і@ResponseBody
вказати контролер кожен метод якого успадковує тип рівня@ResponseBody
анотацію і, отже, пише прямо в тіло відповіді по порівнянні з дозволом перегляду і рендеринга з шаблоном HTML.
@RequestBody
є параметром, @ResponseBody
є методом. важлива різниця!
@ResponseBody
це. Як ви тільки що сказали, @RequestBody
йде за параметром, правда? Але у вищенаведеній відповіді ви маєте це за методом.
@RequestBody
насправді все-таки потрібно, @ResponseBody
неявне під час використання @RestController
. Будь ласка, виправте свою відповідь, у ній є занадто багато підстав, щоб бути помилковими!
@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;
}
}
У наведеному вище прикладі вони відображатимуть усі дані користувача та конкретні ідентифікатори, тепер я хочу використовувати і id, і ім’я,
1) localhost: 8093 / plejson / shop / user <--- це посилання відображатиме всі дані користувача
2) localhost: 8093 / plejson / shop / user / 11 <----, якщо я використовую 11 у посиланні, значить, це буде відобразити конкретного користувача 11 деталей
тепер я хочу використовувати і id, і ім’я
localhost: 8093 / plejson / shop / user / 11 / raju <----------------- як це означає, що ми можемо використовувати будь-яку в цьому, будь ласка, допоможіть мені .... .
@ResponseBody
примітку щодо параметра, а не методу. Я отримую помилки, намагаючись застосувати його до методу, тому я припускаю, що ваша інша відповідь правильна. Я думаю, ви повинні матиgetDescription(@RequestBody UserStats stats)
вище.