Spring MVC возвращает пользовательский код состояния HTTP (без ошибок)

В аннотации Spring MVC @RequestMapping в качестве результата я возвращаю имя страницы JSP. Это возвращает HTTP-код состояния 200 OK. Как я могу изменить этот код состояния на что-то вроде 201 созданный?

@ResponseStatus не работает. Кроме того, HttpServletResponse не будет работать, так как мне нужно только вернуть свою пользовательскую страницу JSP.

@RequestMapping(method = RequestMethod.POST)
public String addPhone(@ModelAttribute("phone") Phone phoneVO) {
                phoneManager.addPhone(phoneVO);
                return "redirect:/phone";
}

4 ответа

Решение

Хорошо, я нашел решение:

response.setStatus(HttpServletResponse.SC_CREATED); return "phonePage";

Как упоминалось @SotiriosDelimanolis, редирект перезаписывал значение в setStatus. Таким образом, вместо перенаправления, я вызываю страницу JSP напрямую (одновременно с повторной отправкой параметров).

Я думаю, с перенаправлением, статус должен быть HTTP OK.

Для тех из вас, кто хочет установить статус, возвращая объект модели, такой как я:

@RequestMapping(value = "/yourRoute", method = RequestMethod.POST)
public ModelAndView accountsPagePOST(@RequestBody final String body) 
{
    ModelAndView model = new ModelAndView("yourView");
    //TODO do your logic and add your objects
    model.setStatus(HttpStatus.OK);
    return model;
}

Надеюсь, что это кому-то поможет... Очевидно, вы можете установить статус отказа в случае, если что-то пойдет не так.

Вы должны попробовать выполнить следующее, вместо этого вы должны вернуть имя вашего представления без какого-либо перенаправления, решатель весеннего представления должен сделать все необходимое для разрешения вашего пользовательского jsp. (Вы должны правильно настроить распознаватель вида)

 @RequestMapping(method = RequestMethod.POST)
 public String addPhone(@ModelAttribute("phone") Phone phoneVO,    HttpServletResponse response) {
            phoneManager.addPhone(phoneVO);
            response.setStatus(HttpServletResponse.SC_CREATED);
            return "phone";
 }

Другим вариантом может быть использование аннотации @ResponseStatus в самом методе вашего обработчика, так как он уверен, что ответственность addPhone заключается в создании нового ресурса на сервере. Следовательно вы можете определить по методу обработчика статус.

 @RequestMapping(method = RequestMethod.POST)
 @ResponseStatus(HttpStatus.CREATED)
 public String addPhone(@ModelAttribute("phone") Phone phoneVO,    HttpServletResponse response) {
            phoneManager.addPhone(phoneVO);
            return "phone";
 }
@RequestMapping(method = RequestMethod.POST)
public String addPhone(@ModelAttribute("phone") Phone phoneVO) {
    phoneManager.addPhone(phoneVO);
    return "/phone";
}

К сожалению, отправлено до того, как я закончил. Предназначен для записи, что вы можете добавить HttpServletResponse в качестве параметра, а затем использовать его для установки кода.

Другие вопросы по тегам