@RequestBody et @ Responsabilebody annotations au printemps

est-ce que quelqu'un peut expliquer les annotations @RequestBody et @ResponseBody au printemps 3? Quels sont-ils? Des exemples serait génial.

111
demandé sur abhi 2012-07-02 14:33:13

4 réponses

il y a toute une Section dans les docs appelée 16.3.3.4 mappage du corps de la requête avec l'annotation @RequestBody . Et un autre appelé 16.3.3.5 Mapping the response body with the @Responsabilebody annotation . Je vous suggère de consulter ces articles. Aussi pertinentes: @RequestBody la documentation javadoc, @ResponseBody la documentation javadoc

exemples d'Utilisation serait quelque chose comme ceci:

en utilisant une bibliothèque JavaScript comme JQuery, vous posteriez 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 avoir un <mvc:annotation-driven> setup), Spring convertirait le JSON entrant en un objet UserStats du corps du post (parce que vous avez ajouté le @RequestBody annotation) et il sérialiserait l'objet retourné à JSON (parce que vous avez ajouté l'annotation @ResponseBody ). Donc 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

Note: RequestBody / Responsibody n'est bien sûr pas limité à JSON, les deux peuvent gérer les formats alternatifs et / ou substituts, y compris le texte en clair et XML, mais JSON est probablement le format le plus utilisé.


Maj: Depuis le printemps 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. Voir création de contrôleurs REST avec l'annotation de @RestController

180
répondu Sean Patrick Floyd 2017-05-23 12:26:31

@RequestBody : L'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);
}

@responsable annotation peut être mise sur une méthode et indique que le type de retour doit être écrit directement à L'organisme de réponse HTTP (et non placé dans un modèle, ou interprété comme une vue nom.)

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 supprimera la nécessité d'utiliser @ResponseBody .

pour plus de détails

19
répondu Premraj 2016-06-02 04:51:46

ci-Dessous est un exemple d'une méthode en Java contrôleur.

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

en utilisant l'annotation @RequestBody vous obtiendrez vos valeurs mappées avec le modèle que vous avez créé dans votre système pour traiter n'importe quel appel spécifique. En utilisant @Responsabilebody vous pouvez renvoyer n'importe quoi à l'endroit d'où la demande a été générée. Les deux choses seront mappées facilement sans écrire n'importe quel parser personnalisé etc.

1
répondu AbdusSalam 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;
 }


}

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/utilisateur <---ce lien pour afficher tous les détails de l'utilisateur

2) localhost:8093/plejson/shop/utilisateur/11 <----si j'utilise 11 en lien les moyens, il affiche particulier de l'utilisateur 11 détails

maintenant je veux utiliser à la fois id et nom

localhost:8093/plejson/shop/utilisateur/11/raju <-----------------comme ceci cela signifie que nous pouvons utiliser l'une dans cette s'il vous plaît, aidez-moi.....

0
répondu user5409646 2016-01-13 08:07:09