業務背景:上傳excel文件進行基礎數據校驗,然而東西太多寫著寫著就...自然成了測試的KPI了
解決思路:使用現有的注解處理,原理使用@validate注解原理
直接上干貨,一行代碼搞定校驗:
ValidateUtils.validate(List.of(fieldReq));
目錄
工具類
測試實體
工具類
import jakarta.annotation.Resource;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validator;
import org.springframework.stereotype.Component;import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;/*** date:2025/4/23 22:56* author: haohaounique@163.com*/
@Component
public class ValidateUtils {public static final String TIP = "第%s行數據異常,%s,請檢查";//注意jdk版本不同引入的包不同//import jakarta.validation.Validator;//import javax.validation.Validator;private static Validator validator;public Validator getValidator() {return validator;}@Resourcepublic void setValidator(Validator validator) {ValidateUtils.validator = validator;}//默認從第1行開始 index=1public static <T> void validate(List<T> list) {if (Objects.isNull(list) || list.isEmpty()) {return;}AtomicInteger atomicInteger = new AtomicInteger(0);for (T t : list) {int lineNo = atomicInteger.addAndGet(1);Set<ConstraintViolation<T>> validate = validator.validate(t);if (!validate.isEmpty()) {//可自定義throw new IllegalArgumentException(String.format(TIP,lineNo,validate.iterator().next().getMessage()));}}}//指定起始行號public static <T> void validate(List<T> list,Integer startIndex) {if (Objects.isNull(list) || list.isEmpty()) {return;}if (startIndex==null || startIndex<0) {startIndex = 0;}AtomicInteger atomicInteger = new AtomicInteger(startIndex);for (T t : list) {int lineNo = atomicInteger.addAndGet(1);Set<ConstraintViolation<T>> validate = validator.validate(t);if (!validate.isEmpty()) {//可自定義throw new IllegalArgumentException(String.format(TIP,lineNo,validate.iterator().next().getMessage()));}}}
}
測試實體
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;/*** date:2025/3/16 9:33* author: haohaounique@163.com*/
@Data
@Schema(description = "規則配置添加請求")
public class RuleConfigAddReq {/*** 規則KEY*/@Schema(description = "規則KEY",requiredMode = Schema.RequiredMode.REQUIRED)@NotBlank(message = "規則KEY不能為空")private String ruleKey;/*** 字段名稱*/@Schema(description = "字段名稱")@NotBlank(message = "字段名稱不能為空")private String fieldName;/*** 字段描述*/@Schema(description = "字段描述")@NotBlank(message = "字段描述不能為空")private String fieldDescription;/*** 類名*/@Schema(description = "類名")@NotBlank(message = "類名不能為空")private String className;/*** 類描述*/@Schema(description = "類描述")@NotBlank(message = "類描述不能為空")private String classDescription;/*** 表達式*/@Schema(description = "表達式")@NotBlank(message = "表達式不能為空")private String expression;/*** 順序*/@Schema(description = "順序")@NotNull(message = "順序不能為空")private Integer ruleOrder;/*** 提示信息*/@Schema(description = "提示信息")@NotBlank(message = "提示信息編碼不能為空")private String tipCode;/*** 提示信息*/@Schema(description = "提示信息")@NotBlank(message = "提示信息不能為空")private String tipMessage;
}
仿上傳之后用easyexcel解析后生成的實體對象進行測試【此處省略上傳解析,工具類待后續文章補充】
@RequestMapping("/validate")public void validate() {RuleConfigAddReq ruleConfigAddReq = new RuleConfigAddReq();ruleConfigAddReq.setRuleKey("ruleKey");ruleConfigAddReq.setFieldName("fieldName");ruleConfigAddReq.setFieldDescription("fieldDescription");ruleConfigAddReq.setClassName("className");ruleConfigAddReq.setClassDescription("classDescription");ruleConfigAddReq.setExpression("expression");ruleConfigAddReq.setRuleOrder(1);FieldReq fieldReq = new FieldReq();//ValidateUtils.validate(List.of(fieldReq));}