Anotaciones @RequestBody y @ResponseBody en primavera


¿Puede alguien explicar las @RequestBody y @ResponseBody anotaciones en la Primavera 3? ¿Para qué son? Cualquier ejemplo sería genial.

Author: abhi, 2012-07-02

4 answers

Hay una sección completa en los documentos llamada 16.3.3.4 Mapeando el cuerpo de la solicitud con la anotación @RequestBody. Y uno llamado 16.3.3.5 Mapeando el cuerpo de respuesta con la anotación @ResponseBody. Le sugiero que consulte esas secciones. También relevante: @RequestBody javadocs, @ResponseBody javadocs

Los ejemplos de uso serían algo como esto:

Usando una biblioteca JavaScript como jQuery, publicarías un objeto JSON como esto:

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

Su método de controlador 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 si tienes Jackson en tu classpath (y tienes un <mvc:annotation-driven> setup), Spring convertiría el JSON entrante en un objeto UserStats del cuerpo post (porque agregaste la anotación @RequestBody) y serializaría el objeto devuelto a JSON (porque agregaste la anotación @ResponseBody). Así que el Navegador / Cliente vería este resultado JSON:

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

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

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


Actualización: Desde la Primavera 4.x, normalmente no usarás @ResponseBody a nivel de método, sino @RestController a nivel de clase, con el mismo efecto. Ver Crear controladores REST con el @ RestController anotación

 180
Author: Sean Patrick Floyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:31

@Cuerpo de la solicitud : La anotación que indica un parámetro de método debe estar vinculada 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 la anotación se puede poner en un método e indica que el tipo devuelto debe escribirse directamente en el cuerpo de la respuesta HTTP (y no colocarse 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 usar @RestController anotación en lugar de @Controller anotación. Esto eliminará la necesidad de usar @ResponseBody.

Para más detalles

 19
Author: Premraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-02 04:51:46

A continuación se muestra un ejemplo de un método en un controlador Java.

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

Usando la anotación @RequestBody obtendrá sus valores mapeados con el modelo que creó en su sistema para manejar cualquier llamada específica. Mientras que usando @ResponseBody puede enviar cualquier cosa de vuelta al lugar desde donde se generó la solicitud. Ambas cosas se mapearán fácilmente sin escribir ningún analizador personalizado, etc.

 1
Author: AbdusSalam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-04 03:59:28
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 van a mostrar todos los detalles de usuario y particulares id ahora quiero usar id y nombre,

1) localhost: 8093 / plejson / shop / user 2) localhost: 8093 / plejson / shop / user / 11

Ahora quiero usar tanto id como name

Localhost: 8093 / plejson / shop / user / 11 / raju

 0
Author: user5409646,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-13 08:07:09