Spring MVC 返回自定义 HTTP 状态码(无错误)
Posted
技术标签:
【中文标题】Spring MVC 返回自定义 HTTP 状态码(无错误)【英文标题】:Spring MVC return custom HTTP status code (no error) 【发布时间】:2017-03-30 03:50:24 【问题描述】:在 Spring MVC @RequestMapping 注释中,我返回 JSP 页面名称作为结果。这将返回 HTTP 状态代码 200 OK。如何将此状态代码更改为 201 created 之类的内容?
@ResponseStatus 不起作用。此外,HttpServletResponse 不起作用,因为我只需要返回我的自定义 JSP 页面。
@RequestMapping(method = RequestMethod.POST)
public String addPhone(@ModelAttribute("phone") Phone phoneVO)
phoneManager.addPhone(phoneVO);
return "redirect:/phone";
【问题讨论】:
您发布的内容应该返回 301 或 302。您正在执行重定向。 它正在返回 HTTP 200 OK 【参考方案1】:对于像我这样想要设置返回模型对象的状态的人:
@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;
希望这对某人有所帮助...您显然可以设置失败状态以防出现问题。
【讨论】:
【参考方案2】:好的,我找到了解决方案:
response.setStatus(HttpServletResponse.SC_CREATED);
return "phonePage";
正如@SotiriosDelimanolis 所述,重定向覆盖了 setStatus 中的值。所以,我不是重定向,而是直接调用 JSP 页面(同时也重新发送参数)。
我猜想使用重定向,状态必须是 HTTP OK。
【讨论】:
【参考方案3】:您应该尝试执行以下操作,您应该返回您的视图名称而不进行任何重定向,弹簧视图解析器应该可以解决您的自定义 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";
【讨论】:
phone 实际上是 url (/phone) 而不是视图名称。我需要重定向只是因为直接调用视图不允许我传递参数。 @ShubhamVadhera 您在问题中指的是什么参数? 通过model.addAttribute
从程序到jsp页面的任何属性。例如:model.addAttribute("nextid", phoneManager.getNextID());
【参考方案4】:
@RequestMapping(method = RequestMethod.POST)
public String addPhone(@ModelAttribute("phone") Phone phoneVO)
phoneManager.addPhone(phoneVO);
return "/phone";
糟糕,在我完成之前发送。打算写一下,可以添加HttpServletResponse作为参数,然后用它来设置代码。
【讨论】:
sendRedirect
将覆盖setStatus
中的值。有更好的方法来实现重定向,而无需在控制器类型中涉及 Servlet API。
现在我不知道你在暗示什么。
如前所述,我不能使用 HttpServletResponse,因为我只需要使用自定义 JSP 页面进行响应。看起来重定向正在覆盖响应状态。需要找到另一种重定向方式。以上是关于Spring MVC 返回自定义 HTTP 状态码(无错误)的主要内容,如果未能解决你的问题,请参考以下文章
spring mvc中,RestController如何自定义返回的HTTP状态
如何通过在 Spring MVC 中返回自定义错误页面来全局处理 404 异常?
Spring Boot 默认异常映射到标准 HTTP 状态码