ResponseStatus
註解,它用於表示一個方法的呼叫結果應該返回特定的 HTTP 狀態碼。這通常用於異常處理或當方法執行成功但需要通知客戶端一個特定的狀態時。
業務場景:
假設你正在開發一個 RESTful API,用於管理使用者賬戶。當用戶嘗試刪除自己的賬戶時,如果操作成功,你希望返回 HTTP 狀態碼 200 OK
;如果使用者沒有足夠的許可權執行刪除操作,則返回 403 Forbidden
。
1. 使用 ResponseStatus
註解:
import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; @RestController @RequestMapping("/users") public class UserController { @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) // 指定成功時的 HTTP 狀態碼 public void deleteUser(@PathVariable Long id) { // 刪除使用者的業務邏輯 if (!userAuthService.hasDeletePermission(id)) { throw new ResponseStatusException(HttpStatus.FORBIDDEN, "User does not have permission to delete this account."); } // 執行刪除操作... } }
在這個控制器中,deleteUser
方法使用 @ResponseStatus
註解來指定當使用者成功刪除賬戶時,應返回 HTTP 狀態碼 200 OK
。如果使用者沒有刪除許可權,將丟擲 ResponseStatusException
異常,並返回 403 Forbidden
。
2. 異常處理:
Spring MVC 還允許你透過異常處理來設定 ResponseStatus
:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ResponseStatusException.class) public ResponseEntity<Object> handleResponseStatusException(ResponseStatusException ex) { // 可以自定義響應體,例如包含錯誤資訊的 JSON 物件 ErrorResponse errorResponse = new ErrorResponse(ex.getStatus().value(), ex.getReason()); return new ResponseEntity<>(errorResponse, ex.getStatus()); } public static class ErrorResponse { private int status; private String message; public ErrorResponse(int status, String message) { this.status = status; this.message = message; } // 標準的 getter 和 setter } }
3. 測試 API:
當用戶具有刪除許可權時,傳送 DELETE 請求到
/users/{id}
,你將得到一個空的響應體和一個200 OK
狀態碼。當用戶沒有刪除許可權時,同樣的請求將導致
403 Forbidden
狀態碼,並返回一個包含錯誤資訊的 JSON 物件。
總結:
@ResponseStatus
允許開發者明確地指定方法執行成功後應該返回的 HTTP 狀態碼。它提高了 API 的透明度和一致性,使得客戶端開發者可以更清楚地理解 API 的行為。
結合異常處理,
@ResponseStatus
可以提供統一和定製化的錯誤處理機制。