限制條件的強制執行

使用 Java 進行資料清理

Dennis Lee

Software Engineer

資料品質控管

  • 驗證註解:資料的品質控管
  • 錯誤:遺漏國家、金額無效、出貨箱數為負
  • 打字錯誤:把 100 箱寫成 1000 箱

 

 

Salesperson Country Product Date Amount Boxes Shipped
James Rudeforth UK Mint Chip Choco 4-Jan-22 $5320 100
Van Tuxwell India 85% Dark Bars 1-Aug-22 $7896 94
Gigi Bohling US Peanut Butter Cubes 7-Jul-22 $4501 91
使用 Java 進行資料清理

基本驗證註解

import jakarta.validation.constraints.NotNull;     // 匯入欄位不可為空的規則
import jakarta.validation.constraints.Size;        // 匯入字串長度的規則

public class ChocolateSale {
    @NotNull(message = "Salesperson cannot be empty")
    private String salesperson;


@NotNull(message = "Country cannot be empty") // 可疊加多個規則 @Size(min = 2, max = 50) // 強制國名長度範圍 private String country;
@NotNull(message = "Product cannot be empty") private String product; }
使用 Java 進行資料清理

數值限制

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
// 訊息輸出稍後示範
public class ChocolateSale {
    @Min(value = 0, message = "Sales amount must be positive")
    private Double amount;


@Min(value = 1, message = "Must ship at least 1 box") @Max(value = 1000, message = "Cannot ship more than 1000 boxes") private Integer boxesShipped; }
使用 Java 進行資料清理

強制執行限制的匯入項

// 儲存唯一的驗證錯誤(不重複)
import java.util.Set;
// 單一驗證錯誤的細節(欄位、訊息等)
import jakarta.validation.ConstraintViolation;
// 建立驗證器的進入點
import jakarta.validation.Validation;
// 依規則檢查資料
import jakarta.validation.Validator;
// 產生已設定好的驗證器
import jakarta.validation.ValidatorFactory;
// 驗證失敗時拋出
import jakarta.validation.ConstraintViolationException;
使用 Java 進行資料清理

實作驗證器

class SalesValidator {
    // 建立檢查資料的工具
    private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();

// 取得驗證器以檢查銷售紀錄 private static final Validator validator = factory.getValidator();
public static Set<ConstraintViolation<ChocolateSale>> validateSale(ChocolateSale sale) { // 檢查銷售紀錄並回傳找到的問題 return validator.validate(sale); } }
使用 Java 進行資料清理

處理驗證結果

public class Main {
    public static void main(String[] args) {
        // 建立含無效資料的紀錄(country 為 null、amount 為負)
        ChocolateSale sale = new ChocolateSale("James Rudeforth", null, "Mint Chip Choco",
                LocalDate.parse("2022-01-04"), -5320.0, 1500);


// 檢查違反驗證的情況 Set<ConstraintViolation<ChocolateSale>> violations = SalesValidator.validateSale(sale); // 列印每一筆驗證錯誤訊息 violations.forEach(violation -> System.out.println(violation.getMessage()));
// 若有任何違規,拋出例外 if (!violations.isEmpty()) throw new ConstraintViolationException(violations); } }
使用 Java 進行資料清理

驗證輸出

Country cannot be empty
Sales amount must be positive
Cannot ship more than 1000 boxes

Exception in thread "main" jakarta.validation.ConstraintViolationException
使用 Java 進行資料清理

驗證可避免高成本錯誤

  • @NotNull@Size@Min@Max 可提早攔截錯誤
  • 將驗證技術套用到一般商務問題
  • 成本高昂的資料錯誤,先期防堵

工廠環境中篩選可可豆

使用 Java 進行資料清理

一起來練習吧!

使用 Java 進行資料清理

Preparing Video For Download...