2012-10-11 63 views
95

我使用jQuery的$.getJSON()來對我簡單的Spring MVC後端進行異步調用。大多數的春天控制器方法是這樣的:如果Spring MVC控制器方法不返回值,返回什麼?

@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(...) { 
    ... 
} 

如果不是,在這裏使用什麼適當的語法?提前致謝!

+0

我假設如果你不返回任何東西,將不會有任何內容發回來? – arahant

+1

我想我仍然會返回某種POJO,即使在解決方案的第1版中它只是包裝了「成功」布爾值或類似的東西。然後你在所有的AJAX方法中都有一致的模式,而當你發現你需要返回一些東西的時候,這些模式更容易構建。 – millhouse

+0

與答案的建議相反,您在第二個代碼段中首次使用的內容完全正確,並且是處理POST數據的正確方法。 –

回答

181

可以返回void,那麼你必須標記與@ResponseStatus方法(值= HttpStatus.OK)你不需要@ ResponseBody

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

只有get方法返回200個狀態碼含蓄,所有別人對你有做的三兩件事之一:

  • 返回void和標記與@ResponseStatus方法(值= HttpStatus.OK)
  • 返回一個對象,並使用標記@ResponseBody它
  • 返回一個HttpEntity實例
+2

如果在兩者之間發生運行時異常,將返回HTTP 500,而不是200.因此,如果您的前端處理失敗,則異常/錯誤消息將正確顯示。 –

+18

其實,你不需要設置'@ ResponseStatus'而不應該。只需在'void'處理程序上使用'@ ResponseBody'就足夠了。 –

+10

我認爲最好是返回204無內容而不是200無效方法 – raspacorp

38

你可以簡單地用適當的頭返回ResponseEntity:

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

Incase任何人遇到我所做的相同的問題,這不適用於彈簧的老版本(4.1.1)我會得到500錯誤。我升級到4.2.0,這個效果很好 – sauce

+0

這是我更喜歡返回空200的方法。由於Spring 4.1使用了構建器模式:return ResponseEntity.ok()。build(); – GreenTurtle

0

但作爲系統尺寸變大和功能...我認爲總是返回一個JSON並不是一個壞主意。更多的是建築/「大規模設計」問題。

您可以考慮總是使用兩個已知字段:代碼和數據來回顧一下JSON。代碼是一個數字代碼,指定要完成的操作的成功,數據是與所請求的操作/服務相關的任何附加數據。

來吧,當我們使用後端服務提供商時,可以檢查任何服務以查看它是否運行良好。

所以我堅持,不要讓春天管理這個,暴露混合返回操作(有些返回數據其他什麼都沒有......).. instaed確保你的服務器公開更接近同質的接口。在一天結束時更簡單。

2

返回空缺@ResponseBody並且您應該爲POST請求沒有任何問題。

使用HTTP狀態代碼來定義異常處理程序例程中的錯誤,而其他人都提到了成功狀態。正常的方法將返回您想要的200響應代碼,然後任何異常處理程序可以返回錯誤對象和不同的代碼(即500)。

1

是的,你可以使用與@ResponseBody回報void類型:

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

那麼返回類型是什麼?它是HTTP狀態碼嗎? – spandey15

7

您可以返回 「ResponseEntity」 對象。 使用「ResponseEntity」對象在構造響應對象(包含Response Body和HTTP Status Code)時以及在從響應對象中獲取信息時都非常方便。 (),getBody(),getContentType(),getStatusCode()等方法使讀取ResponseEntity對象的工作非常容易。

您應該使用帶有http狀態碼204(無內容)的ResponseEntity對象,該對象專門用於指定請求已正確處理且響應主體有意空白。 使用適當的狀態碼傳達正確的信息是非常重要的,特別是在製作將被多個客戶端應用程序使用的API時。

+0

在瀏覽器中爲我設置了'@ResponseStatus(HttpStatus.NO_CONTENT)'解決了XML解析錯誤:找不到根元素 – aliopi

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) 
相關問題