Java 如果Spring MVC控制器方法没有';t返回值?

Java 如果Spring MVC控制器方法没有';t返回值?,java,jquery,spring-mvc,Java,Jquery,Spring Mvc,我使用jQuery的$.getJSON()对我的简单Spring MVC后端进行异步调用。大多数Spring控制器方法如下所示: @RequestMapping(value = "/someURL", method = RequestMethod.POST) public @ResponseBody SomePOJO getSomeData(@ModelAttribute Widget widget, @RequestParam("type") S

我使用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);
}   
我已经做了一些设置,以便每个控制器将
@ResponseBody
作为JSON返回,这正是客户端所期望的

但是当请求不应该向客户端返回任何内容时会发生什么情况呢?我可以要:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
public @ResponseBody void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}

如果没有,这里使用什么合适的语法?

您只需返回带有适当标题的ResponseEntity:

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

您可以返回void,然后必须用@ResponseStatus(value=HttpStatus.OK)标记该方法,您不需要@responseboody

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseStatus(value = HttpStatus.OK)
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}
仅get方法返回200状态代码隐式,所有其他方法都执行以下三项操作之一:

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

但随着系统规模和功能的增长。。。我认为总是返回json一点也不坏。更多的是一个建筑/大规模设计的问题

您可以考虑始终返回一个包含两个已知字段的JSON:代码和数据。其中,代码是一个数字代码,指定要执行的操作的成功,数据是与请求的操作/服务相关的任何传统数据

来吧,当我们使用后端服务提供商时,可以检查任何服务是否工作良好


所以我坚持,不让spring管理这个,公开混合返回操作(一些返回数据,其他什么都没有…)。。instaed确保您的服务器公开更同质的界面。在一天结束时更简单。

返回一个无效的
@ResponseBody
并没有什么错,您应该为
POST
请求提供帮助


使用HTTP状态代码来定义异常处理程序例程中的错误,而不是其他人提到的成功状态。您使用的普通方法将返回您想要的响应代码
200
,然后任何异常处理程序都可以返回错误对象和不同的代码(即
500
)。

是的,您可以使用@ResponseBody和
void
返回类型:

@RequestMapping(value = "/updateSomeData" method = RequestMethod.POST)
@ResponseBody
public void updateDataThatDoesntRequireClientToBeNotified(...) {
    ...
}
您可以返回“ResponseEntity”对象。 在构造响应对象(包含响应体和HTTP状态代码)时以及从响应对象获取信息时,使用“ResponseEntity”对象都非常方便

诸如getHeaders()、getBody()、getContentType()、getStatusCode()等方法使得读取ResponseEntity对象的工作非常简单

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

我假设如果您不返回任何内容,就不会有任何内容返回?我想我还是会返回某种POJO,即使在解决方案的版本1中,它也只是包装了一个“成功”布尔值或类似的东西。然后,您在所有AJAX方法中都有一个一致的模式,并且当您确实需要返回某些内容时,可以更容易地构建它!与答案相反,您在第二个代码片段中的第一个内容非常好,是处理
POST
数据的正确方法。实际上,您不需要设置
@ResponseStatus
,也不应该设置。只要在
void
处理程序上使用
@ResponseBody
就足够了。我认为最好返回204 No内容,而不是200 for voidmethods@raspacorp“200对于POST来说是正确的,因为它并不意味着有一个主体。@BrettRyan只是作为一个评论,至少对于REST API来说,一个常见的做法是使用POST创建内容,在这种情况下,POST通常返回已创建实体的id、完整创建实体或指向读取操作的链接。从REST API的角度来看,没有内容的200状态返回可能会令人困惑。@ams如果我不同时使用(@responseBy和@ResponseStatus(value=HttpStatus.OK))选项,那么会发生什么情况???如果有人遇到我遇到的相同问题,这在旧版本的spring(4.1.1)上不起作用,我将得到500个错误。我升级到4.2.0,效果非常好,这也是我最喜欢的返回空200的方法。因为Spring4.1使用了构建器模式:returnresponseEntity.ok().build();虽然看起来是编译的,但它给出了以下警告
ResponseEntity是原始类型。泛型类型ResponseEntity的引用应该参数化
I使用ResponseEntity作为返回类型。没有警告,可以返回任何响应类型设置
@ResponseStatus(HttpStatus.No_CONTENT)
已解决
XML解析错误:在浏览器中找不到我的根元素因此返回类型是什么。。是HTTP状态码吗?@Tech初学者在本例中为200(OK)。