iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
Mobile Development

Spring Boot+Android 30天 實戰開發 系列 第 9

【Day - 09】更簡潔的數據驗證 - Spring Validation (上)

  • 分享至 

  • xImage
  •  

1. 引言

在應用程式開發中,數據驗證是確保應用程式正常運行和數據完整性的關鍵組成部分。數據驗證有助於偵測和防止無效、不合法或惡意的輸入,提高了應用程式的穩健性和安全性。在大多數應用程式中,使用者提供的數據需要經過驗證,以確保它們符合預期的格式和要求。

Spring Validation 是 Spring 框架的一部分,用於簡化數據驗證的過程。它提供了一組註解和工具,使數據驗證變得更加容易和靈活。通過使用 Spring Validation,開發人員可以輕鬆地添加驗證規則,並在驗證失敗時提供有用的錯誤消息。

  • 本文將涵蓋以下內容:
    • 探討 Spring Validation 的核心概念和常見用法。
    • 學習如何使用驗證註解來執行數據驗證,包括空值檢查、數值檢查、日期和時間檢查等。
    • 討論如何創建自定義驗證規則,並將其整合到 Spring 應用程式中。
    • 討論如何進行分組驗證,根據不同驗證場景進行參數驗證。
    • 探討在驗證失敗時如何處理異常和自定義錯誤消息。
    • 強調數據驗證在應用程式中的關鍵作用,以提高數據品質和應用程式的安全性。

2. 數據驗證概述&環境配置

在這一節中,我們將深入了解數據驗證的概念以及為什麼數據驗證在應用程式開發中至關重要。我們還將探討如何在 Spring Boot 專案中配置數據驗證環境。

2.1 什麼是數據驗證?

數據驗證是一種確保應用程式接收到正確、有效數據的過程。在許多應用程式中,使用者和其他系統提供的數據是不可靠的。因此,數據驗證成為了防止錯誤、安全漏洞和不一致性的關鍵步驟。

  • 數據驗證有助於確保:
    • 應用程式僅接受符合預期格式和約束的數據。
    • 數據在被存儲或處理之前是有效的。
    • 防止不合法或惡意數據進入應用程式,從而提高安全性。

2.2 為什麼數據驗證很重要?

  • 數據驗證在應用程式中起著至關重要的作用,具有以下優勢和益處:
    • 數據品質提高: 通過驗證數據,可以確保數據品質。這有助於防止應用程式中的錯誤數據,從而提高了應用程式的可靠性。
    • 安全性增強: 數據驗證有助於防止惡意攻擊,如 SQL 注入和跨站腳本(XSS)攻擊。它可以確保輸入的數據不包含惡意程式碼。
    • 錯誤減少: 通過驗證數據,可以在數據進入應用程式之前捕獲錯誤。這有助於減少後續階段的錯誤,降低了應用程式維護的成本。
    • 一致性維護: 數據驗證有助於確保數據的一致性,使其符合應用程式的預期格式和要求。

2.3 數據驗證在應用程式中的應用

  • 數據驗證在各種應用程式中都有廣泛的應用,包括但不限於:
    • 使用者註冊和登錄: 在使用者註冊和登錄過程中,需要驗證使用者提供的使用者名稱和密碼是否有效,以確保安全性。
    • 表單驗證: 在Web應用程式中,表單是主要的使用者輸入方式。數據驗證用於檢查表單提交的數據是否有效。
    • API輸入驗證: 對於後端API,數據驗證用於檢查傳入請求的數據是否滿足要求。
    • 數據存儲: 在將數據存儲到數據庫或文件系統之前,需要驗證數據的有效性。
    • 交易處理: 在金融應用程式中,數據驗證用於確保交易的準確性和完整性。

總之,數據驗證是確保應用程式正常運行、數據安全性的關鍵組成部分。在接下來的部分,我們將學習如何在 Spring Boot 項目中實施數據驗證。

2.4 配置數據驗證環境

在 Spring Boot 項目中使用數據驗證之前,我們需要進行一些配置,包括添加必要的依賴項。以下是配置數據驗證環境的基本步驟:

步驟一:添加 Spring Validation 依賴

首先,在你的 Spring Boot 項目中需要添加 Spring Validation 依賴。這個依賴包含了 Spring Validation 的核心庫,使你能夠在應用程式中使用驗證註解。

在項目的Maven構建檔案 pom.xml 中添加以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

這個依賴會自動包含在 Spring Boot Starter 中,因此你通常不需要手動添加。

步驟二:配置驗證環境

Spring Boot 默認情況下會自動配置驗證環境,但你也可以根據需要進行自定義配置。你可以在 application.propertiesapplication.yml 文件中添加以下配置屬性:

# 啟用或禁用驗證
spring.mvc.validation.enabled=true

# 驗證消息的本地化
spring.mvc.validation.locale=zh_TW

這些配置屬性允許您啟用或禁用驗證,以及設置驗證消息的本地化。

一旦完成了這些配置,您的 Spring Boot 項目就已經準備好使用數據驗證了。在接下來的章節中,我們將深入探討如何使用各種驗證註解來驗證數據。

3. 常用的Spring Validation

Spring Validation 註解通常可分為以下幾類,每個類別用於不同類型的數據驗證:

3.1 空值檢查

用於檢查數據是否為 null 或者空值。

註解 說明
@NotBlank 用於字串,字串不能為 null 也不能為空字串。
@NotEmpty 對於集合(MapListSet)不能為空,必須有元素。
@NotNull 不能為 null
@Null 必須為 null
@Size(min, max) 檢查String、Collection、Map、陣列的大小是否在指定範圍內。
  • 範例程式碼:
    public class User {
        @NotBlank
        private String username; // 字串不能為 null 也不能為空字串
    
        @NotEmpty
        private List<String> roles; // 集合不能為空,必須有元素
    
        @NotNull
        private Integer age; // 不能為 null
    
        @Null
        private String middleName; // 必須為 null
    
        @Size(min = 2, max = 50)
        private String fullName; // 字串長度必須在2到50個字符之間
    }
    

3.2 數值檢查

用於檢查數值型數據是否滿足特定的條件。

註解 說明
@Max(value) 檢查數字是否小於或等於指定的最大值。
@Min(value) 檢查數字是否大於或等於指定的最小值。
@DecimalMax(value) 檢查數字是否小於或等於指定的最大值,可用於 BigDecimal。
@DecimalMin(value) 檢查數字是否大於或等於指定的最小值,可用於 BigDecimal。
@Digits(integer, fraction) 檢查數值的整數部分和小數部分的位數是否在指定範圍內。
@Positive 檢查數字是否為正數(不包括零)。
@PositiveOrZero 檢查數字是否為正數或 0。
@Negative 檢查數字是否為負數(不包括零)。
@NegativeOrZero 檢查數字是否為負數或 0。
  • 範例程式碼:
    public class Product {
    
      @Min(value = 1, message = "產品ID必須大於等於1")
      private int productId;
    
      @Max(value = 1000, message = "價格不能超過1000")
      @DecimalMax(value = "1000.00", message = "價格不能超過1000.00")
      private BigDecimal price;
    
      @Digits(integer = 4, fraction = 2, message = "折扣必須是一個數字,整數部分不超過4位,小數部分不超過2位")
      private BigDecimal discount;
    
      @Positive(message = "庫存數量必須是正數")
      private int stockQuantity;
    
      @NegativeOrZero(message = "折扣金額必須是負數或零")
      private double discountAmount;
    
      // 省略其他欄位和方法
    }
    

3.3 日期和時間檢查

用於檢查日期和時間型數據是否符合指定的格式或條件。

註解 說明
@Past 檢查日期或時間是否在當前時間之前。
@Future 檢查日期或時間是否在當前時間之後。
@DateTimeFormat(pattern) 指定日期或時間的格式,用於數據的格式化和解析。
  • 範例程式碼:
    public class Event {
        @Past(message = "事件開始日期必須在過去")
        @DateTimeFormat(pattern = "yyyy-MM-dd")
        private LocalDate startDate;
    
        @Future(message = "事件結束日期必須在未來")
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private LocalDateTime endDate;
    }
    
    在上面的範例中,我們定義了一個 Event 類,其中包含兩個日期和時間屬性 startDateendDate。我們使用了 @Past 註解來確保 startDate 必須在過去,而 @Future 註解確保 endDate 必須在未來。此外,我們還使用了 @DateTimeFormat 註解來指定日期和時間的格式,以便在格式化和解析資料時使用。

3.4 其他檢查

除了上述常見的檢查外,還有其他一些用於特殊情況的註解。

註解 說明
@Email 檢查字串是否是有效的電子郵件地址。
@URL 檢查字串是否是有效的 URL。
@Pattern(regexp) 檢查字串數據是否匹配指定的正則表達式。
@Valid 用於嵌套物件的校驗,通常與複雜物件的欄位一起使用。
@AssertTrue@AssertFalse 分別檢查數據是否為 true 和 false。
  • 範例程式碼:
    public class User {
        @Email
        private String email;
    
        @Pattern(regexp = "^[A-Za-z0-9]+$")
        private String username;
    
        @URL
        private String personalWebsite;
    
        @Valid //在這裡用於嵌套物件的校驗,因為Address類的"postalCode"屬性也使用到驗證註解
        private Address address;
    
        @AssertTrue
        private boolean isActive;
    
        @AssertFalse
        private boolean isDeleted;
    
        // 省略其他屬性和方法
    }
    
    public class Address {
        @Pattern(regexp = "^[0-9]{5}$")
        private String postalCode;
    
        // 省略其他屬性和方法
    }
    

這些註解允許你在 Spring Boot 中進行廣泛的數據驗證,確保應用程式接收到有效的輸入數據。你可以根據具體的校驗需求選擇適當的註解。

3.5 實際操作

當使用 Spring Validation 進行資料驗證時,通常需要建立一個控制器來接收請求並驗證輸入的資料。以下是一個完整的示例,演示如何使用 Spring Boot 和 Spring Validation 建立一個簡單的 RESTful Web 服務,以及如何使用 Postman 進行測試。

(1) 首先,確保你的專案中已經包含了 Spring Boot Starter Web 和 Spring Validation 依賴。你可以在 Maven 配置中添加以下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

(2) 創建一個用於驗證的實體類。假設我們要創建一個簡單的使用者註冊服務:

@Data //Lombok註解
public class AppUser {
    @NotBlank
    @Size(min = 2, max = 30)
    private String username;

    @NotBlank
    @Email
    private String email;
}

在這個示例中,我們使用了@NotBlank@Size註解來驗證使用者名稱的有效性,以及使用 @NotBlank@Email 註解來驗證電子郵件地址的有效性。

(3) 建立一個控制器來處理使用者註冊請求:

@RestController
@RequestMapping("/api")
@Validated
public class UserController {

    @PostMapping("/register")
    public ResponseEntity<String> registerUser(@RequestBody @Valid AppUser user) {
        // 處理使用者註冊邏輯,例如將使用者儲存到資料庫
        return ResponseEntity.ok("使用者註冊成功!");
    }
}

在這個示例中,我們使用 @Validated 註解來啟用資料驗證,確保在進入 registerUser 方法之前,User 物件會被驗證。如果驗證失敗,將返回適當的錯誤響應。如果驗證成功,將返回成功的響應。

(4) 使用 Postman 來測試這個服務。啟動你的 Spring Boot 應用程式,然後使用 Postman 發送 POST 請求到 http://localhost:8080/register,請求主體中包含以下 JSON 數據:

{
    "username": "ian_liu",
    "email": "ian.liu@example.com"
}
  • 成功回應:如果請求有效,你將收到一個成功回應,狀態碼為 200,回應內容為 "使用者註冊成功!"。
    無法顯示圖片
  • 失敗回應:如果你嘗試發送不完整或無效的數據,你將收到相應的驗證錯誤。
    無法顯示圖片

這是一個簡單的示例,演示了如何使用 Spring Validation 在 Spring Boot 中驗證數據。你可以根據需要擴展和定制驗證規則,以滿足你的應用程式要求。


上一篇
【Day - 08】Spring Boot中使用Lombok簡化Java開發
下一篇
【Day - 10】更簡潔的數據驗證 - Spring Validation (下)
系列文
Spring Boot+Android 30天 實戰開發 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言