@RequestBody и @ ResponseBody аннотации весной



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

913   4  

4 ответов:

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

теперь, если у вас есть Джексон на вашем 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

    Ничего не найдено.