webentwicklung-frage-antwort-db.com.de

Was muss zurückgegeben werden, wenn die Spring MVC-Controller-Methode keinen Wert zurückgibt?

Ich benutze jQueries $.getJSON(), um mein einfaches Spring MVC-Backend asynchron aufzurufen. Die meisten Spring-Controller-Methoden sehen folgendermaßen aus:

@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
    @RequestParam("type") String type) {
    return someDAO.getSomeData(widget, type);
}   

Ich habe Dinge so eingerichtet, dass jeder Controller den @ResponseBody als JSON zurückgibt, was der Client erwartet.

Was passiert aber, wenn eine Anfrage keinen Inhalt an den Client zurückgeben soll? Kann ich haben:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

Wenn nicht, welche Syntax sollte hier verwendet werden? Danke im Voraus!

110
IAmYourFaja

sie können void zurückgeben, dann müssen Sie die Methode mit @ResponseStatus (Wert = HttpStatus.OK) markieren. @ResponseBody ist nicht erforderlich

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

Nur Methoden erhalten eine 200-Statuscode-Implizität, alle anderen, die Sie haben, haben eine der folgenden drei Möglichkeiten: 

  • Geben Sie void zurück und markieren Sie die Methode mit @ResponseStatus(value = HttpStatus.OK).
  • Ein Objekt zurückgeben und mit @ResponseBody markieren 
  • Gibt eine HttpEntity-Instanz zurück 
216
ams

Sie können einfach eine ResponseEntity mit dem entsprechenden Header zurückgeben:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}
40
Biju Kunjummen

Sie können das "ResponseEntity" -Objekt zurückgeben. Das Verwenden des "ResponseEntity" -Objekts ist sowohl zum Zeitpunkt der Erstellung des Antwortobjekts (das den Antworttext und den HTTP-Statuscode enthält) als auch zum Abrufen von Informationen aus dem Antwortobjekt sehr praktisch .

Methoden wie getHeaders (), getBody (), getContentType (), getStatusCode () usw. erleichtern das Lesen des ResponseEntity-Objekts.

Sie sollten ein ResponseEntity-Objekt mit einem http-Statuscode von 204 (Kein Inhalt) verwenden, um insbesondere anzugeben, dass die Anforderung ordnungsgemäß verarbeitet wurde und der Antworttextkörper absichtlich leer ist. Verwenden Sie geeignete Statuscodes, um die richtigen Informationen zu übermitteln ist sehr wichtig, insbesondere wenn Sie eine API erstellen, die von mehreren Clientanwendungen verwendet wird.

7
Harley

Ja, Sie können @ResponseBody mit dem Rückgabetyp void verwenden:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}
3
user1338062

Es ist nichts dagegen einzuwenden, einen ungültigen @ResponseBody zurückzugeben, und Sie sollten dies für POST-Anforderungen tun.

Verwenden Sie HTTP-Statuscodes, um Fehler stattdessen in Exception-Handler-Routinen zu definieren, da andere den Erfolgsstatus angeben. Bei einer normalen Methode wird ein Antwortcode von 200 zurückgegeben. Dies ist das, was Sie möchten. Jeder Ausnahmebehandler kann dann ein Fehlerobjekt und einen anderen Code (d. H. 500) zurückgeben.

2
Brett Ryan

Aber da Ihr System an Größe und Funktionalität wächst, denke ich, dass es immer keine schlechte Idee ist, immer einen Json zurückzugeben. Ist mehr eine architektonische/"große Design" Angelegenheit.

Sie können immer daran denken, immer ein JSON mit zwei bekannten Feldern zurückzugeben: Code und Daten. Dabei ist Code ein numerischer Code, der den Erfolg der auszuführenden Operation angibt, und Daten sind alle zusätzlichen Daten, die sich auf die angeforderte Operation/Dienstleistung beziehen. 

Komm schon, wenn wir einen Backend-Dienstanbieter verwenden, kann jeder Dienst überprüft werden, ob er gut funktioniert hat.

Ich bleibe dabei, um es dem Frühling nicht zu überlassen, hybride wiederkehrende Operationen (einige Daten und andere Daten ...) bereitzustellen. Stellen Sie daher sicher, dass Ihr Server eine homogenere Schnittstelle verfügbar macht. Ist am Ende des Tages einfacher.

1
Victor

Hier ist Beispielcode, was ich für eine asynchrone Methode gemacht habe

@RequestMapping(value = "/import", method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void importDataFromFile(@RequestParam("file") MultipartFile file) 
{
    accountingSystemHandler.importData(file, assignChargeCodes);
}

Sie müssen nicht alles zurückgeben, was Sie zur Verwendung dieser Anmerkung benötigen, damit Ihre Methode in jedem Fall OK zurückgibt

@ResponseStatus(value = HttpStatus.OK)
0
AbdusSalam