1. 簡介
在 Spring MVC 中,我們有多種方法可以 設置 HTTP 響應的狀態碼。
在本簡短教程中,我們將看到最直接的方法:使用 @ResponseStatus 註解。
2. 在控制器方法中
當端點成功返回時,Spring 提供 HTTP 200 (OK) 響應。
如果我們想指定 控制器方法的響應狀態,我們可以使用 @ResponseStatus 標記該方法。它有兩個可互換的參數來指定所需的響應狀態:code 和 value。例如,我們可以 指示服務器拒絕煮咖啡,因為它是一個茶壺:
@ResponseStatus(HttpStatus.I_AM_A_TEAPOT)
void teaPot() {}
當我們想要指示錯誤時,我們可以通過 reason 參數提供錯誤消息:
@ResponseStatus(HttpStatus.BAD_REQUEST, reason = "Some parameters are invalid")
void onIllegalArgumentException(IllegalArgumentException exception) {}
請注意,當我們設置 reason 時,Spring 會調用 HttpServletResponse.sendError()。因此,它會將 HTML 錯誤頁面發送給客户端,這對於 REST 端點來説不太合適。
請注意,Spring 僅在 標記的方法成功完成(而沒有拋出 Exception)時使用 @ResponseStatus。
3. 使用錯誤處理程序
我們有三種方法可以使用 @ResponseStatus 將 Exception 轉換為 HTTP 響應狀態:
- 使用 @ExceptionHandler
- 使用 @ControllerAdvice
- 標記 Exception 類
為了使用前兩種解決方案,我們必須定義一個錯誤處理方法。您可以在這篇文章中瞭解更多關於此主題的信息。
我們可以使用 @ResponseStatus 與這些錯誤處理方法以與先前章節中常規 MVC 方法相同的方式使用。
當不需要動態錯誤響應時,最簡單直接的解決方案是第三種:使用 @ResponseStatus 標記 Exception 類。
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
class CustomException extends RuntimeException {}
當 Spring 捕獲此 Exception 時,它使用我們在 @ResponseStatus 中提供的設置。
請注意,當我們標記 Exception 類時,Spring 始終調用 HttpServletResponse.sendError(),無論我們是否設置了 reason。
請注意,Spring 使用相同的配置對於子類,除非我們也將它們標記為 @ResponseStatus。
4. 結論
在本文中,我們看到了如何使用 @ResponseStatus 在不同場景中設置 HTTP 響應代碼,包括錯誤處理。