使用 Java 進行資料清理
Dennis Lee
Software Engineer
| 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 |
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; }
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; }
// 儲存唯一的驗證錯誤(不重複)
import java.util.Set;
// 單一驗證錯誤的細節(欄位、訊息等)
import jakarta.validation.ConstraintViolation;
// 建立驗證器的進入點
import jakarta.validation.Validation;
// 依規則檢查資料
import jakarta.validation.Validator;
// 產生已設定好的驗證器
import jakarta.validation.ValidatorFactory;
// 驗證失敗時拋出
import jakarta.validation.ConstraintViolationException;
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); } }
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); } }
Country cannot be empty Sales amount must be positive Cannot ship more than 1000 boxesException in thread "main" jakarta.validation.ConstraintViolationException
@NotNull、@Size、@Min、@Max 可提早攔截錯誤
使用 Java 進行資料清理