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?
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
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);
}
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));
}