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

时间:2012-10-11 10:52:35

标签: 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);
}   

我设置了一些内容,以便每个控制器都将@ResponseBody作为JSON返回,这是客户端所期望的。

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

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

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

7 个答案:

答案 0 :(得分:227)

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

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

只有get方法返回200状态代码隐含,其他所有方法都执行以下三种操作之一:

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

答案 1 :(得分:40)

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

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

答案 2 :(得分:8)

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

getHeaders(),getBody(),getContentType(),getStatusCode()等方法使得阅读ResponseEntity对象的工作变得非常简单。

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

答案 3 :(得分:3)

是的,您可以将@ResponseBody与protected override void Initialize(System.Web.Routing.RequestContext requestContext) { base.Initialize(requestContext); const string culture = "en-GB"; CultureInfo ci = CultureInfo.GetCultureInfo(culture); Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci; } 返回类型一起使用:

void

答案 4 :(得分:2)

返回空格@ResponseBody并没有问题,您应该POST次请求。

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

答案 5 :(得分:1)

但随着你的系统规模和功能的增长......我认为总是回归json并不是一个坏主意。更像是建筑/大规模设计"物质

您可以考虑始终使用两个已知字段来恢复JSON:代码和数据。代码是指定要完成的操作成功的数字代码,数据是与请求的操作/服务相关的任何附加数据。

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

所以我坚持,不要让spring管理这个,暴露混合返回操作(有些返回数据其他什么......).. instaed确保你的服务器暴露出更加同质的界面。在一天结束时更简单。

答案 6 :(得分:0)

以下是我为异步方法做的示例代码

@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)