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 状态码

Mac intellj idea开发Spring MVC,404网页错误

Spring Boot 自定义 http 错误响应?