framework - Cambia dinámicamente el @ResponseStatus en Spring MVC impulsado por anotación
spring mvc example (3)
Realmente no estoy seguro si esto es factible usando Spring 3.2 MVC.
Mi controlador tiene un método declarado como a continuación:
@RequestMapping(method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody List<Foo> getAll(){
return service.getAll();
}
Preguntas:
- ¿Cuál es el significado de
@ResponseStatus(HttpStatus.OK)
? - ¿Significa que el método siempre devolverá un código de estado
HttpStatus.OK
? - ¿Qué ocurre si se lanza una excepción desde la capa de servicio?
- ¿Puedo cambiar el estado de respuesta en caso de que ocurra alguna excepción?
- ¿Cómo puedo manejar múltiples estados de respuesta dependiendo de las condiciones en el mismo método?
No puede establecer múltiples valores de estado para @ResponseStatus
. Un enfoque en el que puedo pensar es usar @ExceptionHandler
para el estado de respuesta que no es HttpStatus.OK
@RequestMapping(value = "login.htm", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public ModelAndView login(@ModelAttribute Login login) {
if(loginIsValidCondition) {
//process login
//.....
return new ModelAndView(...);
}
else{
throw new InvalidLoginException();
}
}
@ExceptionHandler(InvalidLoginException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ModelAndView invalidLogin() {
//handle invalid login
//.....
return new ModelAndView(...);
}
Si devuelve un ResponseEntity directamente, puede establecer el HttpStatus en que:
// return with no body or headers
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
Si desea devolver un error que no sea 404, HttpStatus tiene muchos otros valores para elegir.
@ResponseStatus(HttpStatus.OK)
significa que la solicitud devolverá OK si el método de manejo vuelve normalmente (esta anotación es redundante para este caso, ya que el estado de respuesta predeterminado es HttpStatus.OK
). Si el controlador lanza una excepción, la anotación no se aplica.
¿Cómo puedo manejar múltiples estados de respuesta dependiendo de las condiciones en el mismo método?
Esa pregunta ya ha sido hecha .
¿Puedo cambiar el estado de respuesta en caso de que ocurra alguna excepción?
Tienes dos opciones. Si la clase de excepción es una tuya, puedes anotar la clase de excepción con @ResponseStatus
. La otra opción es proporcionar a la clase de controlador un controlador de excepción, anotado con @ExceptionHandler
, y hacer que el manejador de excepciones establezca el estado de la respuesta.