1. Introducción
En Spring MVC, tenemos muchas formas de establecer el código de estado de una respuesta HTTP .
En este breve tutorial, veremos la forma más sencilla: usando la anotación @ResponseStatus .
2. Sobre los métodos del controlador
Cuando un extremo regresa con éxito, Spring proporciona una respuesta HTTP 200 (OK).
Si queremos especificar el estado de respuesta de un método de controlador , podemos marcar ese método con @ResponseStatus. Tiene dos argumentos intercambiables para el estado de respuesta deseado: código y valor. Por ejemplo, podemos indicar que el servidor se niega a preparar café porque es una tetera:
@ResponseStatus(HttpStatus.I_AM_A_TEAPOT) void teaPot() {}
Cuando queremos señalar un error, podemos proporcionar un mensaje de error mediante el argumento de motivo :
@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid") void onIllegalArgumentException(IllegalArgumentException exception) {}
Tenga en cuenta que cuando establecemos el motivo , Spring llama a HttpServletResponse.sendError () . Por lo tanto, enviará una página de error HTML al cliente, lo que la convierte en una mala opción para los puntos finales REST .
También tenga en cuenta que Spring solo usa @ResponseStatus , cuando el método marcado se completa correctamente (sin lanzar una excepción ).
3. Con controladores de errores
Tenemos tres formas de usar @ResponseStatus para convertir una excepción en un estado de respuesta HTTP:
- usando @ExceptionHandler
- usando @ControllerAdvice
- marcando la clase de excepción
Para utilizar las dos primeras soluciones, tenemos que definir un método de manejo de errores. Puede leer más sobre este tema en este artículo.
Podemos usar @ResponseStatus con estos métodos de manejo de errores de la misma manera que lo hicimos con los métodos MVC regulares en la sección anterior.
Cuando no necesitamos respuestas de error dinámicas, la solución más sencilla es la tercera: marcar la clase Exception con @ResponseStatus:
@ResponseStatus(code = HttpStatus.BAD_REQUEST) class CustomException extends RuntimeException {}
Cuando Spring detecta esta excepción , usa la configuración que proporcionamos en @ResponseStatus .
Tenga en cuenta que cuando marcamos una clase de excepción con @ResponseStatus , Spring siempre llama a HttpServletResponse.sendError () , ya sea que establezcamos la razón o no.
También tenga en cuenta que Spring usa la misma configuración para las subclases, a menos que también las marquemos con @ResponseStatus .
4. Conclusión
En este artículo, vimos cómo podemos usar @ResponseStatus para configurar el código de respuesta HTTP en diferentes escenarios, incluido el manejo de errores.
Como de costumbre, los ejemplos están disponibles en GitHub.