当前位置: 首页 > 知识库问答 >
问题:

有条件地设置HTTP状态,而不直接操作HttpServletResponse

冷英光
2023-03-14

我如何方便地在一个spring MVC请求处理程序中有条件地设置HTTP状态代码?

我有一个响应POST请求的请求处理程序,用于创建新资源。如果请求有效,我希望它重定向到新资源的URI,返回201(已创建)HTTP状态代码。如果请求是无效的,我希望它给用户一个机会来纠正提交的表单中的错误,而不应该给出201的状态代码。

 @RequestMapping(value = { "/myURI/" }, method = RequestMethod.POST)
 public String processNewThingForm(
    @ModelAttribute(value = "name") final String name,
    final BindingResult bindingResult) {

  myValidator.validate(name, bindingResult);

  if (!bindingResult.hasErrors()) {
     getService().createThing(name);
     return "redirect:" + name;
  } else {
     return "newThingView";
  }

}

但这不会给出重定向情况的正确响应状态。

我不能简单地添加一个@responsestatus,因为有两种可能的状态。我希望有一种比手动操作HttpServletResponse更简洁的方法。并且我想指出要使用的视图名称,这样我就不能让请求处理程序返回状态设置适当的responseEntity对象。

共有1个答案

端木冷勋
2023-03-14

如果您想要201响应代码,您可以在创建资源时返回一个带有HttpStatus.created的ResponseEntity,否则返回视图名称。如果是,则不能使用重定向(http代码301)。请参阅RedirectView。

 类似资料:
  • 我在提交jsp文件时遇到以下错误: HTTP状态404-Servlet操作不可用类型状态报告消息Servlet操作不可用说明请求的资源(Servlet操作不可用)不可用。 在index.jsp文件中,我有一个表单,如下所示: 在struts-confif中,我定义了以下操作: indexAction.java

  • 是否有一些基于条件设置属性的语法? 我希望将express设置为一个值或根本不设置(即,不应该有名为express的键),并且在定义后没有额外的语句。我知道我可以将其用作布尔值,但接收端正在使用一个检查,我想知道是否可以避免修改它。 编辑:似乎没有直接解决上述问题的方法。以下是建议: JSON。stringify(Chris Kessel,dystroy): 匿名函数(Paulpro): 一个额外

  • 我有如下代码: 在我的属性文件中,我有: 这不起作用,parseFooBar在第一秒每分钟都被执行。 但是,如果我添加字段: 所以我可以做一个日志,看看它是什么,parseFooBar不会被执行。移除注入的字符串会再次看到parseFooBar执行。我做错了什么? 编辑:这是使用Spring 4.1.5,Spring Boot 1.2.1和JDK 8 编辑2:将注释移动到类型也有效。(无需强制使用

  • 我有一个名为Backend(端口:9090)的服务,位于Zuul(端口:8080)后面。 浏览器在Zuul上调用GET方法,执行重定向。 示例调用:http://localhost:8080/testredirect 结果: 浏览器收到Http状态=200 浏览器URL:http://localhost:8080/testredirect 浏览器显示:Hello world 预期结果: 浏览器应接

  • 因为它创建了一个新的资源,所以如果它返回状态代码201是合适的,但目前它返回200。 我发现如何设置状态代码的唯一方法是让方法返回一个并在那里设置它,但我确实不希望我的所有接口返回一个泛型响应,而不是实际的响应对象(在本例中是)。

  • 正如这篇stackoverflow文章中所述,在调用终端操作之前,不会实际应用筛选器。既然我在调用终端操作之前重新分配了stream的值,那么上面的代码是否仍然是使用Java8流的适当方法呢?