Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Spring boot Restful API 例外處理 demo

Scenario

之前接手舊後端系統,發現在處理例外的時候有一些 bad smell,例如:

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody UserRequest request) {
    try {
        User user = userService.create(request);
        return ResponseEntity.ok(user);
    } catch (IllegalArgumentException e) {
        return ResponseEntity.badRequest().build();
    } catch (Exception e) {
        return ResponseEntity.internalServerError().build();
    }
}

每個 API 幾乎一樣用一個大 try-cache 裡面做很多事,也有可能 cache 許多不同的 exception,這樣會產生很多重複的程式碼,controller 要做的事情也變得複雜。

The demo

藉由這個專案,記錄比較好的做法,例如:

  • 自訂符合商業邏輯的例外。
  • 使用 @RestControllAdvice 集中例外處理流程。

API

建立使用者範例 (HTTP POST /api/user)

Request (JSON)

{
  "name": "ooxxooxxooxx",
  "age": 17
}

Response (application/json)

HTTP 400 Bad Request

{
    "summary": "VALIDATION_FAILED",
    "detail": "age: Must be at least 18"
}

此範例搭配 @RestControllerAdvice 與使用 spring validation 輔助判斷參數是否合乎限制,避免或減少重複的判斷程式碼,而且回應的內容也可以一致。

搜尋使用者範例 (HTTP GET /api/user/{userId})

Request (JSON)

curl "http://localhost:8080/api/user/12345678"

Response

HTTP 404 Not Found

此 API 套用 Null Object Pattern 來表示查無資料,取代用 null 判斷、拋出找不到的例外...等作法。

更新使用者名稱範例 (HTTP PUT /api/user)

Request (JSON)

curl "http://localhost:8080/api/user?id=12345678&name=ooxx"

Response

{
    "summary": "Violate business rule",
    "detail": "違反..."
}

此範例搭配 @RestControllerAdvice 攔截自訂 unchecked exception,這樣在 controller 就不用一堆 try-cache

About

覺得不錯的錯誤處理範例

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages