web-dev-qa-db-fra.com

Spring Boot Rest Controller, comment renvoyer différents codes d’état HTTP?

J'utilise Spring Boot pour une simple API REST et souhaite renvoyer un code de statut HTTP correct en cas d'échec.

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

Etant nouveau dans Spring and Spring Boot, la question de base est de savoir comment puis-je renvoyer différents codes d'état lorsque quelque chose va bien ou échoue?

57
Marco

Vous pouvez utiliser plusieurs options. Un bon moyen consiste à utiliser des exceptions et des classes pour le traitement appelé @ControllerAdvice:

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

Aussi, vous pouvez passer HttpServletResponse à la méthode du contrôleur et simplement définir le code de réponse:

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

Veuillez vous référer au blog génial pour plus de détails: http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

remarque: dans Spring Boot, utiliser l'annotation @ResponseBody est redondant - il est inclus dans @RestController

78
Jakub Kubrynski

Pour ce faire, vous pouvez utiliser ResponseEntity en tant qu'objet de retour.

@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);

}
16
Ankit Basarkar

Essayez ce 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));
}
1
Rodrigo Hernandez