iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0

今天寫文章時在 loop J. cole 這張專輯,推薦裡頭兩首歌~

Yes
No Role Modelz

在上一篇文章中了解了基礎的資料驗證方法。今天繼續來 dig in 更進階的資料驗證方式,例如驗證群組(Validation group)和自定義驗證來客製化符合更多情境。

驗證群組 允許在不同情境下應用不同的驗證規則,例如在用戶註冊和用戶登入時應用不同的資料驗證策略。而自定義驗證 則賦予我們開發彈性,根據業務需求建立特定的驗證規則。

以下是舉例來說明要如何在 Spring Boot 中使用 Validation group:

1. 定義驗證群組

public interface BasicInfoGroup {}
public interface AdvancedInfoGroup {}

這裡定義了兩個介面,用來定義驗證群組。

2. 在 Entity 層使用驗證群組

public class User {

    @NotBlank(groups = BasicInfoGroup.class)
    private String name;

    @NotBlank(groups = BasicInfoGroup.class)
    private String email;

    @NotBlank(groups = AdvancedInfoGroup.class)
    private String address;

    // getters and setters
}

@NotBlank 是一個常用的 Bean Validation 註解,用來確保相對應的屬性非空。
groups 屬性是指定在何時應使用哪個群組的驗證規則。

3. 在 Controller 層使用驗證群組

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping("/basic")
    public ResponseEntity<String> createBasicUser(@Validated(BasicInfoGroup.class) @RequestBody User user) {
        // Business logic
        return ResponseEntity.ok("Basic user created!");
    }

    @PostMapping("/advanced")
    public ResponseEntity<String> createAdvancedUser(@Validated({BasicInfoGroup.class, AdvancedInfoGroup.class}) @RequestBody User user) {
        // Business logic
        return ResponseEntity.ok("Advanced user created!");
    }
}

使用驗證群組時應改用 @Validated 註解。
當呼叫 createBasicUser 方法時,只有屬於 BasicInfoGroup 的驗證規則會被採用。
當呼叫 createAdvancedUser 方法時,則會採用屬於 BasicInfoGroup 和 AdvancedInfoGroup 的驗證規則。

4. 使用驗證群組優點和缺點

優點

  1. 靈活性
    • 驗證群組允許開發者在不同的情境下應用不同的驗證規則。
  2. 減少多餘的程式碼
    • 運用驗證群組可以重用相同的模型,並對不同的應用場景採用不同的驗證規則。
  3. 簡化邏輯
    • 將驗證邏輯與業務邏輯分開,保持程式碼的清晰明瞭。
  4. 增加安全性
    • 可以在特定的情況下適用更嚴格的驗證,增強系統的安全性。

缺點

  1. 複雜度
    • 在某些情況下使用驗證群組可能會增加系統的複雜度,特別是在存有大量驗證規則和群組的大型系統中。
  2. 開發和維護成本
    • 是否使用某項技術或依場景客製化前提都需要考慮未來團隊的維護工作,定義和管理多個驗證群組的確可能導致開發維護的工作量和成本增加,應該視情況並與團隊討論是否如此設計。
  3. 測試的挑戰
    • 確保在所有可能的驗證群組和情境中進行全面的測試,這會增加測試的複雜度和工作量。

上一篇
Day 20 - Validation
下一篇
Day 22 - Service Layer
系列文
Spring Boot 三十天挑戰賽30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言