2013-01-09 57 views
0
@RequestMapping(method = RequestMethod.GET) 
@ResponseBody 
public List<Country> getListOfCountries() { 

    return countryService.listAll(); 
} 

它顯示對象的json視圖,但如果服務返回null,那麼我想顯示一條錯誤消息,任何建議請問?Spring mvc控制器空返回處理程序

+1

這應該工作OTB因爲傑克遜不會轉換爲空(我最後一次檢查)。這就是說,如果你的請求接受的內容類型是'application/json',你會得到一個錯誤,但不是理想的錯誤。它可能顯示爲空字符串的原因是因爲您發送了錯誤的接受MIME類型。不過正如其他人所說的那樣,你真的不應該返回null。 –

回答

2

首先,即使這並不直接回答這個問題,你的對象不應該再回到,而不是空的集合 - 你可以找到在Effective Java 2nd Edition推理,第43/201頁

所以,如果當沒有發現國家的情況是正常的,必須由客戶端JS代碼,將檢查次數,並顯示相應的信息處理。

如果出現問題,你可以拋出一個異常(正如Biju指出的+1) - 我相信服務人員應該拋出異常,因爲它知道它發生的原因,而不是返回null 。

我想補充說的是,在Spring 3.2中(在Spring 3.2之前返回響應主體是complicated),您可以設置一個@ExceptionHandler,它將返回JSON並設置稍後可由客戶端處理的HTTP狀態代碼。我認爲用一些錯誤代碼返回一個自定義的JSON響應在這裏是最優的。

@RequestMapping("/test") 
    @ResponseBody 
    public List<Country> getListOfCountries() { 
     //assuming that your service throws new NoCountriesFoundException(); 
      //when something goes wrong 
      return countryService.listAll(); 
    } 

    @ExceptionHandler(NoCountriesFoundException.class) 
    ResponseEntity<String> test() { 
     return new ResponseEntity<String>(
       "We are sorry, our server does not know any countries yet.", 
       HttpStatus.I_AM_A_TEAPOT ); 
    } 

然後在JS代碼,您可以根據返回的狀態碼做特定的處理。

此外,爲避免在不同的控制器中聲明相同的@ExceptionHandler,在Spring 3.2中,可以將@ExceptionHandler放入@ControllerAdvice註釋類中。

有關詳細信息,請參閱http://static.springsource.org/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-exceptionhandlershttp://www.springsource.org/node/3738 3.2具體的事情

+1

+1他還應該配置他的迴應轉換器永遠不回讓'null'(即禁用字符串轉換),但IIRC這需要在MVC消息轉換器的一些痛苦的配置。如果他的AJAX正確設置其「內容類型」,它應該會失敗,因爲Jackson不會支持返回null。 –

+0

如果在服務中發生異常不上控制器@ExceptionHandler收穫? –

+0

@ user1827614如果在服務方法中發生異常,它將沿着堆棧傳播到控制器方法(如果服務方法是從控制器調用的)。 –

2

你有幾個選項,我認爲:

  1. 如果返回一個空回來,這將作爲一個空字符串「」,你也許可以尋找那些和處理它返回。

  2. 在列表頂部返回一個包裝類型,這種方式如果包裝列表爲null,則返回客戶端{"countries":null},這可以在javascript端更容易處理。

  3. 拋出一個異常,這將作爲傳播500個狀態碼返回給客戶端,就可以對JavaScript端的錯誤處理程序來處理這種情況。