1. 概述
本文檔將演示幾種從 Spring MVC 控制器返回自定義 HTTP 狀態碼的方法。
這通常很重要,以便更清晰地表達請求對客户端的結果,並充分利用 HTTP 協議的豐富語義。例如,如果請求出現問題,為每種可能的問題發送特定的錯誤代碼將允許客户端向用户顯示適當的錯誤消息。
本文章的設置基本 Spring MVC 項目不在本文檔的範圍之內,但您可以在這裏找到更多信息。
2. 返回自定義狀態碼
Spring 提供幾種主要方式從其 Controller 類中返回自定義狀態碼:
- 使用 ResponseEntity
- 使用異常類上的 @ResponseStatus 註解,以及
- 使用 @ControllerAdvice 和 @ExceptionHandler 註解。
這些選項並非互斥,事實上,它們可以相互補充。
本文將涵蓋前兩種方法(ResponseEntity 和 @ResponseStatus)。如果您想了解更多關於使用 @ControllerAdvice 和 @ExceptionHandler 的信息,請閲讀這裏。
2.1. 通過 ResponseEntity 返回狀態碼
在標準的 Spring MVC 控制器中,我們將定義一個簡單的映射:
@RequestMapping(value = "/controller", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaResponseEntity() {
return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
}收到 GET 請求“/controller”時,Spring 會返回一個帶有 406 狀態碼(Not Acceptable)的響應。我們此處採用的特定響應碼僅為示例,您可以返回任何 HTTP 狀態碼(完整的列表可以在 這裏找到)。
2.2. 通過異常返回狀態碼
我們將為控制器添加第二個方法,以演示如何使用 Exception 返回狀態碼:
@RequestMapping(value = "/exception", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaException() {
throw new ForbiddenException();
}收到針對“/exception”的 GET 請求時,Spring 會拋出 ForbiddenException。這是一個自定義異常,我們將會在一個單獨的類中定義:
@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {}<p>無需在此異常中提供任何代碼。所有工作都由 <em title="ResponseStatus">@ResponseStatus</em> 註解完成。</p>
<p>在這種情況下,當異常被拋出時,拋出異常的控制器將返回帶有響應代碼 403(禁止訪問)的響應。如果需要,您還可以通過註解中添加一條消息,該消息將與響應一起返回。</p>
<p>在這種情況下,類將如下所示:</p>
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason="To show an example of a custom message")
public class ForbiddenException extends RuntimeException {}需要注意的是,雖然從技術上講,返回值可以設置為任何狀態碼,但在大多數情況下,只應使用異常碼(4XX和5XX)來處理錯誤代碼,這樣做更有邏輯意義。
3. 結論
本教程演示瞭如何從 Spring MVC 控制器中返回自定義狀態碼。