web-dev-qa-db-fra.com

Annotations @RequestBody et @ResponseBody au printemps

Quelqu'un peut-il expliquer les annotations @RequestBody et @ResponseBody au printemps 3? À quoi servent-ils? Tous les exemples seraient géniaux.

131
leo

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é.


Mise à jour

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.

204
Sean Patrick Floyd

@ 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.

pour plus de détails

24
Premraj

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.

4
AbdusSalam
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 .... .

1
user5409646