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

我正在使用jQuery的$.getJSON()asynchronous调用我的简单的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(...) { ... } 

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

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

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

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

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

你可以简单地返回一个ResponseEntity和适当的头文件:

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

你可以返回“ResponseEntity”对象。 使用“ResponseEntity”对象在构造响应对象(包含Response Body和HTTP Status Code)时以及在从响应对象中获取信息时都非常方便。

诸如getHeaders(),getBody(),getContentType(),getStatusCode()等方法使读取ResponseEntity对象的工作非常容易。

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

返回无效的@ResponseBody没有错,你应该为POST请求。

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

是的,你可以使用void返回types的@ResponseBody:

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

但随着你的系统在规模和function上的增长…我认为总是返回一个JSON并不是一个坏主意。 更多的是build筑/“大规模devise”的问题。

你可以考虑总是使用两个知道的字段:代码和数据。 代码是一个数字代码,指定要完成的操作是否成功,数据是与所请求的操作/服务有关的任何附加数据。

来吧,当我们使用服务提供商的后端,任何服务可以检查,看看它是否运作良好。

所以我坚持,不要让springpipe理这个,暴露混合返回操作(有些返回数据其他什么都没有…)。instaed确保您的服务器暴露更加均匀的接口。 在一天结束时更简单。

以下是我为asynchronous方法所做的示例代码

 @RequestMapping(value = "/import", method = RequestMethod.POST) @ResponseStatus(value = HttpStatus.OK) public void importDataFromFile(@RequestParam("file") MultipartFile file) { accountingSystemHandler.importData(file, assignChargeCodes); } 

你不需要从你的方法中返回任何东西,你只需要使用这个注解,这样你的方法在任何情况下都应该返回OK

 @ResponseStatus(value = HttpStatus.OK)