如果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)