【问题标题】:Spring MVC return custom HTTP status code (no error)Spring MVC 返回自定义 HTTP 状态码(无错误)
【发布时间】: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

标签: java spring jsp spring-mvc


【解决方案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 页面进行响应。看起来重定向正在覆盖响应状态。需要找到另一种重定向方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多