2013-07-08 6 views
23

Ich bin wirklich nicht sicher, ob dies mit Spring 3.2 MVC möglich ist.Dynamisch Ändern des @ResponseStatus in Annotation getrieben Spring MVC

My-Controller wird ein Verfahren erklärt, wie unten:

@RequestMapping(method = RequestMethod.GET) 
@ResponseStatus(HttpStatus.OK) 
public @ResponseBody List<Foo> getAll(){ 
    return service.getAll(); 
} 

Fragen:

  1. Was ist die Bedeutung von @ResponseStatus(HttpStatus.OK) ist?
  2. Bedeutet dies, dass die Methode immer einen HttpStatus.OK Statuscode zurückgibt.
  3. Was passiert, wenn eine Ausnahme von der Service-Schicht ausgelöst wird?
  4. Kann ich den Antwortstatus bei Auftreten einer Ausnahme ändern?
  5. Wie kann ich mehrere Antwortstatus abhängig von Bedingungen in der gleichen Methode behandeln?
+0

http://www.captaindebug.com/2012/02/spring-3-mvc-exception-handlers-and_14.html#.Vapp2JSgPqR –

+0

** 1. ** Bitte lesen Sie [Status] (http: // www.w3.org/Protocols/rfc2616/rfc2616-sec10.html Wahrscheinlich sollten Sie 'ResponseEntity' verwenden. – user902691

Antwort

22

@ResponseStatus(HttpStatus.OK) bedeutet, dass die Anforderung OK zurück, wenn das Handhabungsverfahren normalerweise zurückgibt (Diese Anmerkung ist für diesen Fall redundant, da der Standardantwortstatus ist HttpStatus.OK). Wenn der Handler eine Ausnahme auslöst, trifft die Annotation nicht zu.

Wie kann ich mehrere Antwortstatus abhängig von Bedingungen in der gleichen Methode behandeln?

Diese Frage has already been asked.

Kann ich den Antwortstatus beim Auftreten jeder Ausnahme

Sie haben zwei Möglichkeiten ändern. Wenn die Ausnahmeklasse eine eigene Klasse ist, können Sie die Ausnahmeklasse mit @ResponseStatus annotieren. Die andere Möglichkeit besteht darin, die Controller-Klasse mit einem Exception-Handler auszustatten, der mit @ExceptionHandler annotiert ist und bei dem der Ausnahmehandler den Antwortstatus gesetzt hat.

+0

Ja die Frage ist schon gestellt aber hast du eine Antwort bekommen ?? – dharam

+0

Es ist egal, ob ich eine Antwort bekommen habe; Der zweite Teil Ihrer Frage ist ein Duplikat einer vorherigen Frage. Doppelte Fragen werden geschlossen, daher sollte der wichtige Teil Ihrer Frage der erste Teil sein. – Raedwald

+6

Es wurde gefragt, aber die einzige Antwort erhielt eine Down-Abstimmung.Sie sollten eine konkrete Antwort auf die zweite Frage geben, anstatt auf diesen zweifelhaften Thread zu zeigen. – Bnrdo

9

Sie können für @ResponseStatus keinen Mehrfachstatuswert festlegen. Ein Ansatz, den ich denken kann, ist @ExceptionHandler für Antwortstatus zu verwenden, die nicht HttpStatus.OK

@RequestMapping(value = "login.htm", method = RequestMethod.POST) 
@ResponseStatus(HttpStatus.OK) 
public ModelAndView login(@ModelAttribute Login login) { 
    if(loginIsValidCondition) { 
     //process login 
     //..... 
     return new ModelAndView(...); 
    } 
    else{ 
     throw new InvalidLoginException(); 
    } 
} 

@ExceptionHandler(InvalidLoginException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
public ModelAndView invalidLogin() { 
    //handle invalid login 
    //..... 
    return new ModelAndView(...); 
} 
12

Wenn Sie eine ResponseEntity direkt zurückgeben, können Sie die Httpstatus, dass ein:

// return with no body or headers  
return new ResponseEntity<String>(HttpStatus.NOT_FOUND); 

Wenn Sie möchten, Geben Sie einen anderen Fehler als 404, HttpStatus has lots of other values zur Auswahl zurück.

Verwandte Themen