Динамическое изменение @ResponseStatus в управляемом аннотацией Spring MVC
Я действительно не уверен, что это возможно с помощью Spring 3.2 MVC.
Мой контроллер имеет метод, объявленный ниже:
@RequestMapping(method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody List<Foo> getAll(){
return service.getAll();
}
Вопросы:
- В чем смысл
@ResponseStatus(HttpStatus.OK)
?
- Означает ли это, что метод всегда возвращает код состояния
HttpStatus.OK
.
- Что делать, если исключение выбрано из уровня сервиса?
- Можно ли изменить статус ответа при возникновении любого исключения?
- Как я могу обрабатывать несколько статусов ответов в зависимости от условий в одном и том же методе?
Ответы
Ответ 1
@ResponseStatus(HttpStatus.OK)
означает, что запрос вернет OK, если метод обработки возвращается нормально (эта аннотация является избыточной для этого случая, поскольку статус ответа по умолчанию - HttpStatus.OK
). Если обработчик выбрасывает исключение, аннотация не применяется.
Как я могу обрабатывать несколько статусов ответа в зависимости от условий в том же методе?
Этот вопрос уже задан.
Могу ли я изменить статус ответа при возникновении любого исключения
У вас есть два варианта. Если класс исключения является вашим собственным, вы можете аннотировать класс исключений с помощью @ResponseStatus
. Другой выбор - предоставить классу контроллера обработчик исключений, аннотированный с помощью @ExceptionHandler
, и обработчик исключений задает статус ответа.
Ответ 2
Если вы возвращаете ResponseEntity напрямую, вы можете установить HttpStatus в том, что:
// return with no body or headers
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
Если вы хотите вернуть ошибку, отличную от 404, HttpStatus имеет множество других значений на выбор.
Ответ 3
Вы не можете установить несколько значений состояния для @ResponseStatus
. Один из подходов, о котором я могу думать, - использовать @ExceptionHandler
для статуса ответа, который не является 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(...);
}