it-swarm.com.de

Anmerkungen @RequestBody und @ResponseBody im Frühjahr

Kann jemand das erklären @RequestBody und @ResponseBody Anmerkungen im Frühjahr 3? Wofür sind sie? Irgendwelche Beispiele wären toll.

131
leo

In den Dokumenten gibt es einen ganzen Abschnitt mit dem Namen 16.3.3.4 Zuordnen des Anforderungshauptteils mit der Annotation @RequestBody . Und man rief 16.3.3.5 Mapping des Antwortkörpers mit der Annotation @ResponseBody auf. Ich schlage vor, Sie konsultieren diese Abschnitte. Ebenfalls relevant: @RequestBody javadocs, @ResponseBody javadocs

Verwendungsbeispiele wären etwa so:

Mit einer JavaScript-Bibliothek wie JQuery würden Sie ein JSON-Objekt wie dieses posten:

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

Ihre Controller-Methode würde folgendermaßen aussehen:

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

Wenn Sie nun Jackson in Ihrem Klassenpfad haben (und ein <mvc:annotation-driven> Setup haben), würde Spring den eingehenden JSON in ein UserStats-Objekt vom Post-Body konvertieren ( weil Sie die Annotation @RequestBody hinzugefügt haben) und das zurückgegebene Objekt in JSON serialisiert wurde (weil Sie die Annotation @ResponseBody hinzugefügt haben). Der Browser/Client würde also das folgende JSON-Ergebnis sehen:

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

Ein vollständiges Arbeitsbeispiel finden Sie in meiner vorherigen Antwort: https://stackoverflow.com/a/5908632/342852

Hinweis: RequestBody/ResponseBody ist natürlich nicht auf JSON beschränkt. Beide Formate können mehrere Formate verarbeiten, einschließlich Nur-Text und XML. JSON ist jedoch wahrscheinlich das am häufigsten verwendete Format.


Aktualisieren

Seit Spring 4.x verwenden Sie normalerweise nicht mehr @ResponseBody Auf Methodenebene, sondern @RestController Auf Klassenebene mit demselben Effekt.

Hier ist ein Zitat aus der offiziellen Spring MVC Dokumentation :

@RestController Ist eine zusammengesetzte Annotation das ist selbst meta-annotiert mit @Controller Und @ResponseBody, Um einen Controller anzugeben, dessen jede Methode die Annotation auf Typebene @ResponseBody Erbt und daher direkt in den Antworttext im Vergleich zur Ansichtsauflösung und zum Rendern mit einer HTML-Vorlage schreibt.

204

@ RequestBody: Eine Anmerkung, die einen Methodenparameter angibt, sollte an den Hauptteil der HTTP-Anforderung gebunden sein.

Zum Beispiel:

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

@ ResponseBody Annotation kann in eine Methode eingefügt werden und gibt an, dass der Rückgabetyp direkt in den HTTP-Antworttext geschrieben werden soll ( und nicht in einem Modell platziert oder als Ansichtsname interpretiert).

Zum Beispiel:

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

Alternativ können wir die Annotation @ RestController anstelle der Annotation @Controller Verwenden. Dadurch entfällt die Verwendung von @ResponseBody.

für mehr Details

24
Premraj

Unten sehen Sie ein Beispiel für eine Methode in einem Java Controller.

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

Wenn Sie die Annotation @RequestBody verwenden, werden Ihre Werte dem Modell zugeordnet, das Sie in Ihrem System für die Verarbeitung eines bestimmten Aufrufs erstellt haben. Während Sie @ResponseBody verwenden, können Sie alles an den Ort zurücksenden, von dem aus die Anfrage generiert wurde. Beide Dinge können einfach abgebildet werden, ohne dass ein eigener Parser geschrieben werden muss.

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


}

Im obigen Beispiel werden jetzt alle Benutzer- und bestimmten ID-Details angezeigt. Ich möchte sowohl die ID als auch den Namen verwenden.

1) localhost: 8093/plejson/shop/user <--- Dieser Link zeigt alle Benutzerdetails an
2) localhost: 8093/plejson/shop/user/11 <---- Wenn ich 11 in Linkmitteln verwende, werden bestimmte Details zu Benutzer 11 angezeigt

jetzt möchte ich sowohl ID als auch Name verwenden

localhost: 8093/plejson/shop/user/11/raju .

1
user5409646