2012-07-02 4 views

ответ

159

Существует целый раздел в документах под названием 16.3.3.4 Mapping the request body with the @RequestBody annotation. И один называется 16.3.3.5 Mapping the response body with the @ResponseBody annotation. Я предлагаю вам ознакомиться с этими разделами. Также актуальны: @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 на вашем пути к классам (и установите настройку <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, вероятно, самый используемый формат.


Update: С тех пор как Spring 4.x, вы обычно не использовать @ResponseBody на уровне метода, а скорее @RestController на уровне класса, с тем же эффектом. См Creating REST Controllers with the @RestController annotation

+2

Большое спасибо @Sean – leo

+0

В ответном ответе вы использовали аннотацию '@ ResponseBody' для параметра, а не метода. Я получаю ошибки, пытаясь поместить его в метод, поэтому я предполагаю, что ваш другой ответ правильный. Я думаю, вы должны иметь 'getDescription (@RequestBody UserStats stats)' выше. – Patrick

+1

@Patrick no, '@ RequestBody' находится в параметре,' @ ResponseBody' находится в методе. важное отличие! –

0
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) локальный: 8093/plejson/магазин/пользователь < - --this ссылка будет отображать все данные пользователя
2) локальный: 8093/plejson/магазин/пользователь/11 < ---- если я использую 11 в средствах ссылок, он будет отображать конкретного пользователя 11 деталей

сейчас хотите использовать оба идентификатора и имя

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

+0

Исправьте форматирование образца ответа и кода. –

+0

Просьба описать, как этот код помогает исследователю. Спасибо. –

+0

http://www.programming-free.com/2014/03/spring-mvc-40-restful-web-service-json.html .................. .. через эту ссылку вы получите ... спасибо – user5409646

15

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

for more details

0

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

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

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

Смежные вопросы