2014-06-18 8 views
44

Ich verwende Spring Boot für eine einfache REST-API und möchte bei einem Fehler einen korrekten HTTP-Statuscode zurückgeben.Spring Boot Rest Controller, wie verschiedene HTTP-Statuscodes zurückgegeben werden?

@RequestMapping(value="/rawdata/", method = RequestMethod.PUT) 
@ResponseBody 
@ResponseStatus(HttpStatus.OK) 
public RestModel create(@RequestBody String data) { 
    // code ommitted.. 
    // how do i return a correct status code if something fails? 
} 

Die neu in Spring and Spring Stiefel, ist die grundlegende Frage, wie kann ich verschiedene Statuscodes zurück, wenn etwas in Ordnung ist oder nicht?

Antwort

63

Es gibt mehrere Optionen, die Sie verwenden können. Ganz guter Weg, um Ausnahmen und Klasse verwenden für @ControllerAdvice genannt Umgang:

@ControllerAdvice 
class GlobalControllerExceptionHandler { 
    @ResponseStatus(HttpStatus.CONFLICT) // 409 
    @ExceptionHandler(DataIntegrityViolationException.class) 
    public void handleConflict() { 
     // Nothing to do 
    } 
} 

Sie können auch HttpServletResponse passieren Methode an die Steuerung und einfach eingestellt Antwortcode:

public RestModel create(@RequestBody String data, HttpServletResponse response) { 
    // code ommitted.. 
    response.setStatus(HttpServletResponse.SC_ACCEPTED); 
} 

Bitte beachten Sie große Blog-Post für Details : http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

Anmerkung: im Frühjahr Stiefel mit @ResponseBody Anmerkung ist überflüssig - es ist in @RestController enthält

+0

Wie Kommentar, den ich vor einen Test 15 Minuten tat, und einen ‚@RestController‘ ohne ‚@ResponseBody‘ Anmerkung über seine Methode platziert die Zeichenfolge nicht zurückgegeben innerhalb des Körpers aber als ForwardedURL. Ich bin ziemlich noob mit Frühling/Springboot mein Selbst so kann nicht darauf hinweisen, warum – Anearion

+0

@Anearion Es gibt einen Tippfehler in der Antwort - wir brauchen eigentlich @RestControllerAdvice, nicht @RestController. – yoliho

+0

Es ist kein Tippfehler. Dieser Teil bezieht sich auf die Frage und Anmerkungen auf einem Controller –

1

Sie können ResponseEntity als Rückgabeobjekt verwenden.

@RequestMapping(value="/rawdata/", method = RequestMethod.PUT) 

public ResponseEntity<?> create(@RequestBody String data) { 

if(everything_fine) 
    return new ResponseEntity<>(RestModel, HttpStatus.OK); 
else 
    return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR); 

} 
0

Versuchen Sie diesen Code:

@RequestMapping(value = "/validate", method = RequestMethod.GET, produces = "application/json") 
public ResponseEntity<ErrorBean> validateUser(@QueryParam("jsonInput") final String jsonInput) { 
    int numberHTTPDesired = 400; 
    ErrorBean responseBean = new ErrorBean(); 
    responseBean.setError("ERROR"); 
    responseBean.setMensaje("Error in validation!"); 

    return new ResponseEntity<ErrorBean>(responseBean, HttpStatus.valueOf(numberHTTPDesired)); 
} 
+0

Da dies eine ziemlich alte Frage ist, sollten Sie Paket- und Versionsinformationen hinzufügen, auf die Sie verweisen. – ZF007

Verwandte Themen