@RequestBody и @ResponseBody аннотации в Spring

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

Ответ 1

В документах есть целый раздел, который называется 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
}

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

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

Смотрите мой предыдущий ответ для полного рабочего примера: fooobar.com/questions/60409/...

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


Обновление

Начиная с Spring 4.x, вы обычно не будете использовать @ResponseBody на уровне метода, а вместо этого будете использовать @RestController на уровне класса с тем же эффектом.

Вот цитата из официальной документации Spring MVC:

@RestController является составной аннотацией, которая сама является мета-аннотированной с @Controller и @ResponseBody, чтобы указать контроллер, чей каждый метод наследует аннотацию уровня типа @ResponseBody и, поэтому пишет напрямую в тело ответа в зависимости от разрешения представления и рендеринг с помощью шаблона HTML.

Ответ 2

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

для более подробной информации

Ответ 3

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

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

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

Ответ 4

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 &lt --- --- эта ссылка будет отображать все данные пользователя
2) localhost: 8093/plejson/shop/user/11 < ---- если я использую 11 в средстве ссылок, он отобразит конкретные данные пользователя 11

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

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