Quelqu'un peut-il expliquer les annotations @RequestBody
et @ResponseBody
au printemps 3? À quoi servent-ils? Tous les exemples seraient géniaux.
Il existe une section entière dans la documentation appelée 16.3.3.4 Mappage du corps de la demande avec l'annotation @RequestBody . Et on a 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
Les exemples d'utilisation ressemblent à ceci:
En utilisant une bibliothèque JavaScript telle que JQuery, vous pouvez poster un objet JSON comme ceci:
_{ "firstName" : "Elmer", "lastName" : "Fudd" }
_
Votre méthode de 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 chemin de classe (et que vous avez configuré <mvc:annotation-driven>
), Spring convertira le JSON entrant en objet UserStats à partir du corps de publication (car vous avez ajouté l'annotation _@RequestBody
_ et il sérialiserait l'objet renvoyé en JSON (car vous avez ajouté l'annotation _@ResponseBody
_). Ainsi, le navigateur/client verrait ce résultat JSON:
_{ "description" : "Elmer Fudd hates wacky wabbits" }
_
Voir ma réponse précédente pour un exemple de travail complet: https://stackoverflow.com/a/5908632/342852
Remarque: RequestBody/ResponseBody n'est bien sûr pas limité à JSON, les deux peuvent gérer plusieurs formats, y compris le texte brut et XML, mais JSON est probablement le format le plus utilisé.
Depuis Spring 4.x, vous n'utiliserez généralement pas _@ResponseBody
_ au niveau de la méthode, mais plutôt _@RestController
_ au niveau de la classe, avec le même effet.
Voici une citation du fonctionnaire documentation Spring MVC :
_
@RestController
_ est un annotation composée qui est lui-même méta-annoté avec _@Controller
_ et _@ResponseBody
_ pour indiquer un contrôleur dont chaque méthode hérite de l'annotation de type _@ResponseBody
_ et écrit donc directement dans le corps de la réponse, par rapport à la résolution de la vue et au rendu avec un modèle HTML.
@ RequestBody: une annotation indiquant un paramètre de méthode doit être liée 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 Une annotation 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 annotation à la place de @Controller
annotation. Cela éliminera la nécessité 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, vos valeurs sont mappées avec le modèle que vous avez créé dans votre système pour gérer tout appel spécifique. 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 mappées sans écrire d’analyseur 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 <---- si j'utilise 11 dans le lien, cela affichera les détails de l'utilisateur 11
maintenant je veux utiliser à la fois l'id et le nom
localhost: 8093/plejson/shop/user/11/raju <----------------- comme ceci, cela signifie que nous pouvons utiliser n'importe lequel de ces éléments, aidez-moi s'il vous plaît .... .