当前位置: 首页 > news >正文

简化excel校验提高开发效率

业务背景:上传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));}

http://www.xdnf.cn/news/206767.html

相关文章:

  • 精益数据分析(31/126):电商关键指标深度解析与实战策略
  • 51LA使用方法与悟空统计,网站数据分析的双重选择
  • Twitter 工作原理|架构解析|社交APP逻辑
  • 微信小程序封装选择年月日时分秒组件
  • “兴火·燎原”总冠军诞生,云宏信息《金融高算力轻量云平台》登顶
  • uni-app 中封装全局音频播放器
  • 无人机航拍牛只检测数据集VOC+YOLO格式906张1类别
  • Codigger Desktop:重新定义数字工作与生活方式
  • 8.idea创建maven项目(使用Log4j日志记录框架+Log4j 介绍)
  • 如何解决 Xcode 签名证书和 Provisioning Profile 过期问题
  • Linux系统基础:基础指令简介(网络概念部分)
  • AtCoder Beginner Contest 403(题解ABCDEF)
  • PLOT: PROMPT LEARNING WITH OPTIMAL TRANSPORT FOR VISION -LANGUAGE MODELS
  • Vue使用Sortablejs拖拽排序 视图显示与数据不一致、拖拽结束后回跳问题
  • 4.27搭建用户界面
  • PostgreSQL数据库批量删除唯一索引
  • 【AI】OrinNX上安装RIVA-2.19.0,实现文本转语音
  • Spring Boot 集成 ActiveMQ 实现异步消息通信(二)
  • Sce2DriveX: 用于场景-到-驾驶学习的通用 MLLM 框架——论文阅读
  • Tauri 跨平台开发指南及实战:用前端技术征服桌面应用(合集-万字长文)
  • 前端安全中的XSS(跨站脚本攻击)
  • 【3dmax笔记】010: 创建标准基本体、扩展基本体
  • Liunx安装Apache Tomcat
  • 阿里云服务迁移实战: 04-IP 迁移
  • Python 环境管理工具使用差别比对文档
  • 扣子智能体2:优化提示词
  • Python 重构“策略”模式:用函数简化设计模式的实践
  • Python在自动驾驶仿真环境中的应用:构建智能驾驶的虚拟世界
  • Java Properties 类详解
  • 「Mac畅玩AIGC与多模态07」开发篇03 - 开发第一个 Agent 插件调用应用