Анотації @RequestBody та @ResponseBody навесні


139

Чи може хтось пояснити @RequestBodyта @ResponseBodyпримітки навесні 3? Для чого вони? Будь-які приклади були б чудовими.

Відповіді:


219

У Документах є цілий Розділ під назвою 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
}

Тепер, якщо у вас є 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.


У своїй пов'язаній відповіді ви використовували @ResponseBodyпримітку щодо параметра, а не методу. Я отримую помилки, намагаючись застосувати його до методу, тому я припускаю, що ваша інша відповідь правильна. Я думаю, ви повинні мати getDescription(@RequestBody UserStats stats)вище.
Патрік

3
@Patrick ні, @RequestBodyє параметром, @ResponseBodyє методом. важлива різниця!
Шон Патрік Флойд

1
@SeanPatrickFloyd Вибачте, я зовсім не хотів згадувати про @ResponseBodyце. Як ви тільки що сказали, @RequestBodyйде за параметром, правда? Але у вищенаведеній відповіді ви маєте це за методом.
Патрік

1
@SeanPatrickFloyd @RequestBodyнасправді все-таки потрібно, @ResponseBodyнеявне під час використання @RestController. Будь ласка, виправте свою відповідь, у ній є занадто багато підстав, щоб бути помилковими!
Sumit Jain

@SumitJain, щоб бути справедливим: ця відповідь була раніше @RestControllerі була змінена, коли вона була представлена
Шон Патрік Флойд

32

@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.

для отримання детальної інформації


5

Нижче наводиться приклад методу в контролері Java.

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

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


1
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 <----------------- як це означає, що ми можемо використовувати будь-яку в цьому, будь ласка, допоможіть мені .... .


Будь ласка, виправте форматування зразка відповіді та коду.
Мацей Лах

Опишіть, будь ласка, як цей код допомагає питаючому. Дякую.
Леонід Гланц


програмування- free.com/ 2014/ 03/… ....................................... .................................................. ..... перейдіть за цим посиланням u, отримаєте подяку
user5409646
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.