156 votes

Annotations @RequestBody et @ResponseBody dans Spring

Quelqu'un peut-il expliquer le @RequestBody y @ResponseBody annotations dans Spring 3 ? À quoi servent-elles ? Tout exemple serait le bienvenu.

244voto

Sean Patrick Floyd Points 109428

Il y a une section entière dans les docs appelée 16.3.3.4 Mappage du corps de la requête avec l'annotation @RequestBody . Et un appelé 16.3.3.5 Mappage du corps de la réponse avec l'annotation @ResponseBody . Je vous suggère de consulter ces sections. Également pertinent : @RequestBody javadocs, @ResponseBody javadocs

Des exemples d'utilisation seraient quelque chose comme ceci :

En utilisant une bibliothèque JavaScript comme JQuery, vous pouvez afficher un objet JSON comme ceci :

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

La méthode de votre contrôleur ressemblerait à ceci :

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

Maintenant, si vous avez Jackson sur votre classpath (et avoir un <mvc:annotation-driven> ), Spring convertirait le JSON entrant en un objet UserStats à partir du corps du message (parce que vous avez ajouté l'élément @RequestBody ) et il sérialise l'objet retourné en JSON (parce que vous avez ajouté l'annotation @ResponseBody annotation). Ainsi, le navigateur/client verra ce résultat JSON :

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

Voir ma réponse précédente pour un exemple complet de fonctionnement : https://stackoverflow.com/a/5908632/342852

Remarque : RequestBody / ResponseBody n'est bien sûr pas limité à JSON, les deux peuvent traiter plusieurs formats, y compris le texte brut et le XML, mais JSON est probablement le format le plus utilisé.


Mise à jour

Depuis Spring 4.x, vous n'utiliserez généralement pas @ResponseBody au niveau des méthodes, mais plutôt @RestController au niveau de la classe, avec le même effet.

Voici une citation de l'officiel Documentation sur Spring MVC :

@RestController est un annotation composée qui est lui-même méta-annoté avec @Controller y @ResponseBody pour indiquer un contrôleur dont chaque méthode hérite du niveau de type @ResponseBody annotation et, écrit donc directement dans le corps de la réponse au lieu de la résolution de la vue et le rendu avec un modèle HTML.

38voto

premraj Points 120

@RequestBody : Annotation indiquant qu'un paramètre de méthode doit être lié au corps de la requête HTTP.

Par exemple :

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

@ResponseBody peut être placée sur une méthode et indique que le type de retour doit être écrit directement dans le corps de la réponse HTTP (et non placé dans un modèle, ou interprété comme un nom de vue).

Par exemple :

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

Alternativement, nous pouvons utiliser @RestController à la place de l'annotation @Controller annotation. Ainsi, il ne sera plus nécessaire d'utiliser @ResponseBody .

pour plus de détails

7voto

AbdusSalam Points 111

Vous trouverez ci-dessous un exemple de méthode dans un contrôleur Java.

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

En utilisant l'annotation @RequestBody, vous obtiendrez vos valeurs mises en correspondance avec le modèle que vous avez créé dans votre système pour traiter tout appel spécifique. En revanche, en utilisant @ResponseBody, vous pouvez renvoyer n'importe quoi à l'endroit d'où la demande a été générée. Les deux choses seront facilement mises en correspondance sans avoir à écrire un analyseur syntaxique personnalisé, etc.

0voto

user5409646 Points 9
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;
 }

}

Dans l'exemple ci-dessus, ils vont afficher tous les détails de l'utilisateur et de l'id particulier, maintenant je veux utiliser à la fois l'id et le nom,

1) localhost:8093/plejson/shop/user <---ce lien affichera tous les détails de l'utilisateur
2) localhost:8093/plejson/shop/user/11 <----if i use 11 in link means, it will display particular user 11 details

maintenant je veux utiliser à la fois l'id et le nom

localhost:8093/plejson/shop/user/11/raju <-----------------like this cela signifie que nous pouvons utiliser n'importe qui dans ce domaine s'il vous plaît aidez-moi .....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X