2012-07-02 56 views

Respuesta

159

Hay toda una sección en los documentos llamada 16.3.3.4 Mapping the request body with the @RequestBody annotation. Y uno llamado 16.3.3.5 Mapping the response body with the @ResponseBody annotation. Te sugiero que consultes esas secciones. También es relevante: @RequestBody javadocs, @ResponseBody javadocs

Ejemplos de uso sería algo como esto:

El uso de un JavaScript-biblioteca como jQuery, que sería publicar un JSON a objetos como esto:

{ "firstName" : "Elmer", "lastName" : "Fudd" } 

Su método de control se vería así:

// 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 
} 

Ahora bien, si usted tiene Jackson en su ruta de clases (y tiene una configuración <mvc:annotation-driven>), Spring convertiría el JSON entrante en un objeto UserStats del cuerpo de la publicación (porque agregó la anotación @RequestBody) y serializaría el objeto devuelto a JSON (porque agregó la anotación @ResponseBody). Por lo que el navegador/cliente podrá ver este resultado JSON:

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

Ver esta respuesta anterior de la mina para un ejemplo de trabajo completo: https://stackoverflow.com/a/5908632/342852

Nota: RequestBody/responseBody es, por supuesto, no se limita a JSON, ambos pueden maneja múltiples formatos, incluyendo texto plano y XML, pero JSON es probablemente el formato más utilizado.


Actualización: Desde 4.x primavera, lo normal es que no utilice @ResponseBody el nivel de método, sino más bien @RestController el nivel de clase, con el mismo efecto. Ver Creating REST Controllers with the @RestController annotation

+2

Muchas gracias @Sean – leo

+0

En su respuesta vinculada, utilizó la anotación '@ ResponseBody' en el parámetro, no el método. Recibo errores al tratar de ponerlo en el método, así que supongo que tu otra respuesta es correcta. Creo que deberías tener 'getDescription (@RequestBody UserStats stats)' arriba. – Patrick

+1

@Patrick no, '@ RequestBody' está en el parámetro,' @ ResponseBody' está en el método. diferencia importante! –

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; 
} 


} 

En el ejemplo anterior se va a mostrar todos los detalles del usuario y en particular id ahora quiero usar ambos ID y el nombre,

1) localhost: 8093/plejson/tienda/usuario < - --este acoplamiento exhibirá todos los datos de usuario
2) localhost: 8093/plejson/tienda/user/11 < ---- si yo uso 11 en medios de enlace, se mostrará el usuario particular 11 detalles

ahora desea utilizar tanto la identificación como el nombre

localhost: 8093/plejson/shop/user/11/raju < ----------------- como este significa que podemos usar cualquiera en esto por favor ayúdenme .....

+0

Corrija el formato del ejemplo de respuesta y código. –

+0

Por favor, describa cómo este código ayuda al interlocutor. Gracias. –

+0

http://www.programming-free.com/2014/03/spring-mvc-40-restful-web-service-json.html .................. ..go través de este enlace obtendrá ... gracias – user5409646

15

@RequestBody: La anotación que indica un parámetro de método debe vincularse al cuerpo de la solicitud HTTP.

Por ejemplo:

@RequestMapping(path = "/something", method = RequestMethod.PUT) 
public void handle(@RequestBody String body, Writer writer) throws IOException { 
    writer.write(body); 
} 

@ResponseBody anotación se puede poner en un método e indica que el tipo de retorno debe ser escrito directamente al cuerpo de la respuesta HTTP (y no colocado en un modelo o interpretarse como un nombre de vista).

Por ejemplo:

@RequestMapping(path = "/something", method = RequestMethod.PUT) 
public @ResponseBody String helloWorld() { 
    return "Hello World"; 
} 

Alternativamente, podemos utilizar @RestController anotación en lugar de @Controller anotación. Esto eliminará la necesidad de usar @ResponseBody.

for more details

0

a continuación es un ejemplo de un método en un controlador de Java.

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

Mediante el uso de la anotación @RequestBody obtendrá sus valores mapeados con el modelo que ha creado en el sistema para el manejo de cualquier llamada específica. Mientras usa @ResponseBody puede enviar cualquier cosa al lugar desde donde se generó la solicitud. Ambas cosas serán mapeadas fácilmente sin escribir ningún analizador personalizado, etc.

Cuestiones relacionadas