Spring Boot應用中實現統一的響應格式與異常管理
在構建Spring Boot應用時,為了提升用戶體驗和維護性,實施統一的響應格式和全局異常管理是非常必要的。本文將詳細闡述如何通過自定義類和注解來實現這一目標,并提供相應的示例代碼。
1. 定義統一響應格式
首先,我們需要定義一個通用的響應類來封裝所有HTTP響應。這個類將包含狀態碼、消息以及響應數據。
public class ApiResponse<T> {
private int code;
private String message;
private T data;
public ApiResponse(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
// Getter和Setter省略
// 提供靜態方法生成成功和失敗的響應
public static <T> ApiResponse<T> success(T data) {
return new ApiResponse<>(200, "操作成功", data);
}
public static <T> ApiResponse<T> failure(String message) {
return new ApiResponse<>(500, message, null);
}
}
2. 實現全局異常處理
接下來,我們將創建一個全局異常處理器來捕獲并處理應用中的所有異常。通過使用@ControllerAdvice注解,我們可以捕獲到所有控制器拋出的異常。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ResponseEntity<ApiResponse<String>> handleException(Exception e) {
// 在這里可以記錄日志、發送警報等操作
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(ApiResponse.failure(e.getMessage()));
}
// 可以針對特定異常進行更詳細的處理
@ExceptionHandler(value = ResourceNotFoundException.class)
public ResponseEntity<ApiResponse<String>> handleResourceNotFoundException(ResourceNotFoundException e) {
return ResponseEntity.notFound().body(ApiResponse.failure(e.getMessage()));
}
}
// 自定義異常類示例
public class ResourceNotFoundException extends RuntimeException {
public ResourceNotFoundException(String message) {
super(message);
}
}
3. 控制器示例
現在,在控制器中,我們可以直接返回ApiResponse對象,而不必擔心響應格式的問題。同時,當發生異常時,全局異常處理器會自動捕獲并處理這些異常。
@RestController
@RequestMapping("/api/data")
public class DataController {
@GetMapping("/{id}")
public ResponseEntity<ApiResponse<String>> getDataById(@PathVariable String id) {
// 假設這里根據id查找數據,可能拋出ResourceNotFoundException
if ("invalid".equals(id)) {
throw new ResourceNotFoundException("未找到對應的數據");
}
return ResponseEntity.ok(ApiResponse.success("找到了數據: " + id));
}
}
4. 測試
現在,啟動Spring Boot應用并嘗試訪問/api/data/valid和/api/data/invalid兩個端點,觀察響應的不同。對于有效的ID,你應該會看到一個成功的響應;而對于無效的ID,你應該會看到一個包含錯誤信息的響應。
通過實施統一的響應格式和全局異常管理,我們不僅能提升用戶體驗,還能使應用的錯誤處理更加集中和一致。這種方式有助于降低代碼的冗余度,并提高應用的可維護性。