2014-06-18 7 views
44

Używam Spring Boot do prostego interfejsu REST API i chciałbym zwrócić poprawny kod statusu HTTP, jeśli coś zawiedzie.Spring Boot Rest Controller, jak zwrócić różne kody statusu HTTP?

@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? 
} 

Jako nowy na wiosnę i wiosenne Boot, podstawowe pytanie brzmi jak mogę zwracać różne kody stanu, gdy coś jest nie w porządku lub nie?

Odpowiedz

63

Istnieje kilka opcji, których można użyć. Dość dobrym sposobem jest użycie wyjątków i klasę za obsługę nazywa @ControllerAdvice:

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

Ponadto można przejść HttpServletResponse do kontrolera sposób i po prostu ustawić kod odpowiedzi:

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

Proszę odnieść się do wielkiej blogu o szczegóły : http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

uwaga: na wiosnę Boot użyciu @ResponseBody adnotacji jest zbędna - to jest wliczone w @RestController

+0

Podobnie jak komentarz, zrobiłem test 15 minut temu, a „@RestController” bez adnotacji „@ResponseBody” nad jego metody umieszczony napis nie powrócił wewnątrz ciała, ale jako ForwardedURL. Jestem całkiem noob z wiosną/wiosną sam siebie, więc nie mogę wskazać, dlaczego: – Anearion

+0

@Anearion W odpowiedzi jest literówka - faktycznie potrzebujemy "@RestControllerAdvice", a nie "@RestController". – yoliho

+0

To nie jest literówka. Ta część jest związana z pytaniem i adnotacjami na kontrolerze –

1

Jednym ze sposobów, aby to zrobić, jest użycie ResponseEntity jako obiektu zwracającego.

@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

Spróbuj kod:

@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

Ponieważ jest to dość stare pytanie, powinieneś dodać informacje o pakiecie i wersji, do których się odwołujesz. – ZF007

Powiązane problemy