Cómo responder con un error HTTP 400 en un método Spring MVC @ResponseBody que devuelve String

Resuelto Jonik asked hace 11 años • 13 respuestas

Estoy usando Spring MVC para una API JSON simple, con un @ResponseBodyenfoque basado como el siguiente. (Ya tengo una capa de servicio que produce JSON directamente).

@RequestMapping(value = "/matches/{matchId}", produces = "application/json")
@ResponseBody
public String match(@PathVariable String matchId) {
    String json = matchService.getMatchJson(matchId);
    if (json == null) {
        // TODO: how to respond with e.g. 400 "bad request"?
    }
    return json;
}

En el escenario dado, ¿cuál es la forma más sencilla y limpia de dar una respuesta con un error HTTP 400?

Me encontré con enfoques como:

return new ResponseEntity(HttpStatus.BAD_REQUEST);

...pero no puedo usarlo aquí ya que el tipo de retorno de mi método es String, no ResponseEntity.

Jonik avatar Apr 26 '13 16:04 Jonik
Aceptado

Cambie su tipo de devolución a ResponseEntity<>y luego podrá usar lo siguiente para 400:

return new ResponseEntity<>(HttpStatus.BAD_REQUEST);

Y para una solicitud correcta:

return new ResponseEntity<>(json,HttpStatus.OK);

Después de Spring 4.1, existen métodos auxiliares en ResponseEntity que podrían usarse como:

return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);

y

return ResponseEntity.ok(json);
Bassem Reda Zohdy avatar Apr 27 '2013 10:04 Bassem Reda Zohdy

Algo como esto debería funcionar, pero no estoy seguro de si existe una forma más sencilla:

@RequestMapping(value = "/matches/{matchId}", produces = "application/json")
@ResponseBody
public String match(@PathVariable String matchId, @RequestBody String body,
            HttpServletRequest request, HttpServletResponse response) {
    String json = matchService.getMatchJson(matchId);
    if (json == null) {
        response.setStatus( HttpServletResponse.SC_BAD_REQUEST  );
    }
    return json;
}
stacker avatar Apr 26 '2013 09:04 stacker