如果Spring MVC控制器方法没有返回值,返回什么?

IAm*_*aja 124 java jquery spring-mvc

我正在使用jQuery $.getJSON()来对我简单的Spring MVC后端进行异步调用.大多数Spring控制器方法如下所示:

@RequestMapping(value = "/someURL", method = RequestMethod.POST)
public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget,
    @RequestParam("type") String type) {
    return someDAO.getSomeData(widget, type);
}   
Run Code Online (Sandbox Code Playgroud)

我设置了一些东西,以便每个控制器都返回@ResponseBodyJSON,这是客户端所期望的.

但是当请求不应该向客户端返回任何内容时会发生什么?我能有......吗:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果没有,这里使用的语法是什么?提前致谢!

ams*_*ams 238

你可以返回void,那么你必须使用@ResponseStatus(value = HttpStatus.OK)标记方法,你不需要@ResponseBody

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

只有get方法返回200状态代码隐含,所有其他方法你做了三件事之一:

  • 返回void并使用标记方法 @ResponseStatus(value = HttpStatus.OK)
  • 返回一个对象并用它标记 @ResponseBody
  • 返回一个HttpEntity实例

  • 实际上,你不需要设置`@ ResponseStatus`而不应该.只需在`void`处理程序上使用`@ ResponseBody`即可. (26认同)
  • 我认为返回204 No Content而不是200 for void方法会更好 (10认同)
  • @BrettRyan只是作为评论,至少对于REST API,通常的做法是POST将用于创建内容,在这种情况下,它通常返回创建的enity,完整创建的实体或链接的id读操作.从REST API的角度来看,没有内容的200状态返回可能会造成混淆. (8认同)
  • 如果发生运行时异常,则返回HTTP 500而不是200.因此,如果前端处理失败,将正确显示异常/错误消息. (2认同)
  • @raspacorp 200 对于 POST 来说是正确的,因为它并不意味着有一个正文。 (2认同)
  • @ams 如果我没有同时使用 **(@ResponseBody AND @ResponseStatus(value = HttpStatus.OK))** 选项,那么会发生什么??? (2认同)

Bij*_*men 42

您只需返回具有相应标头的ResponseEntity:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public ResponseEntity updateDataThatDoesntRequireClientToBeNotified(...){
....
return new ResponseEntity(HttpStatus.OK)
}
Run Code Online (Sandbox Code Playgroud)

  • 尽管似乎可以编译,但它发出以下警告`ResponseEntity是原始类型。泛型类型ResponseEntity <T>的引用应参数化` (3认同)

Har*_*ley 8

您可以返回"ResponseEntity"对象.在构造响应对象(包含响应主体和HTTP状态代码)时以及从响应对象获取信息时,使用"ResponseEntity"对象非常方便.

像getHeaders(),getBody(),getContentType(),getStatusCode()等方法使得读取ResponseEntity对象的工作变得非常容易.

您应该使用HTTP状态代码为204(无内容)的ResponseEntity对象,该对象专门用于指定请求已正确处理且响应正文故意为空.使用适当的状态代码来传达正确的信息非常重要,特别是如果您正在制作将由多个客户端应用程序使用的API.

  • 设置`@ResponseStatus(HttpStatus.NO_CONTENT)`解决了XML解析错误:在浏览器中找不到我的根元素 (3认同)