Spring MVC返回自定义HTTP状态码(无错误)

问题描述:

在Spring MVC @RequestMapping注解中,我返回JSP页面名称作为结果。这将返回HTTP状态码200 OK。我如何将此状态代码更改为201创建的内容?Spring MVC返回自定义HTTP状态码(无错误)

@ResponseStatus不起作用。而且,HttpServletResponse将不起作用,因为我只需要返回我的自定义JSP页面。

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

你发布的内容应该会返回给你301或302.你正在做一个重定向。 –

+0

它返回HTTP 200 OK –

好的,我发现了解决方案:

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

正如@SotiriosDelimanolis提到的,重定向被重写在setStatus值。因此,我不直接调用JSP页面(同时重新发送参数)。

我想重定向,状态必须是HTTP确定。

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

哎呀,我结束之前发送。打算写,你可以添加HttpServletResponse作为参数,然后用它来设置代码。

+0

'sendRedirect'将覆盖'setStatus'中的值。有更好的方法可以实现重定向,而无需在控制器类型中涉及Servlet API。 –

+0

现在我不知道你在暗示什么。 –

+0

正如问题所述,我不能使用HttpServletResponse,因为我只需要使用custome JSP页面进行响应。看起来重定向覆盖了响应状态。需要找到另一种重定向方式。 –

你应该尝试做下面的事情,你应该返回你的视图名称而不用任何重定向,Spring视图解析器应该做需要解析你的自定义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"; 
} 
+0

手机实际上是url(/ phone)而不是视图名称。我只需要重定向,因为直接调用视图不允许我传递参数。 –

+0

@ShubhamVadhera你在问题中指的是什么参数? – ScanQR

+0

通过'model.addAttribute'从程序到jsp页面的任何属性。例如:'model.addAttribute(“nextid”,phoneManager.getNextID());' –

对于那些你想设置状态返回一个模型对象我一样:

@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; 
} 

希望这可以帮助别人......万一出现问题可以很明显的设置故障状态。