Quelqu'un peut-il expliquer le @RequestBody
y @ResponseBody
annotations dans Spring 3 ? À quoi servent-elles ? Tout exemple serait le bienvenu.
Réponses
Trop de publicités?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.
@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
.
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.
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 .....