Подтвердить что ты не робот

Динамическое изменение @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.
  • Что делать, если исключение выбрано из уровня сервиса?
  • Можно ли изменить статус ответа при возникновении любого исключения?
  • Как я могу обрабатывать несколько статусов ответов в зависимости от условий в одном и том же методе?
4b9b3361

Ответ 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(...);
}