用自定义注解实现Excel数据导入中的枚举值校验

使用自定义注解实现Excel数据导入中的枚举值校验

在实际开发中,我们经常需要从Excel文件中导入数据,并且这些数据需要符合一定的规则,比如某些字段的值必须是预定义的枚举值。本文将介绍如何使用自定义注解来实现这一功能,以提高代码的可维护性和可读性。

1. 定义自定义注解

首先,我们需要定义一个自定义注解FieldEnum,用于标记需要进行枚举值校验的字段。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** 字段枚举信息配置** @author liusy* @since 2022/05/30 15:57 星期一*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = {ElementType.FIELD, ElementType.PARAMETER})
public @interface FieldEnum {/*** 枚举类型,从数据库枚举表中校验*/String type() default "";/*** 是否是组合枚举,多个用,分割*/boolean isEnumGroup() default false;/*** 设置本地枚举列表,默认为空,如果设置将从本地枚举列表中获取进行对比** @return 本地枚举列表*/String[] localEnumList() default {};
}

2. 实现校验逻辑

接下来,我们需要实现一个工具类ValidateUtil,用于校验带有FieldEnum注解的字段。


import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.inspur.planning.flow.annotation.FieldEnum;
import com.inspur.planning.flow.exception.CustomException;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.jdbc.core.JdbcTemplate;import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.ValidationException;
import javax.validation.Validator;
import java.lang.reflect.Field;
import java.util.*;/*** @author liusy* @since 2023/03/16 14:40 星期四*/
public class ValidateUtil {public static <T> void validateEnum(T bean) {List<String> errorMsgList = new ArrayList<>();Field[] fields = bean.getClass().getDeclaredFields();for (Field field : fields) {field.setAccessible(true);Object val = getFieldValue(field, bean);if (ObjectUtil.isEmpty(val)) {continue;}FieldEnum fieldEnum = field.getAnnotation(FieldEnum.class);if (fieldEnum != null) {validateFieldEnum(fieldEnum, val, errorMsgList);}}if (!errorMsgList.isEmpty()) {throw new CustomException(String.join(";", errorMsgList));}}private static Object getFieldValue(Field field, Object bean) {try {return field.get(bean);} catch (IllegalAccessException e) {throw new RuntimeException("反射获取字段值失败", e);}}private static void validateFieldEnum(FieldEnum fieldEnum, Object val, List<String> errorMsgList) {String name = val.toString();// 本地枚举校验if (fieldEnum.localEnumList().length > 0) {if (!Arrays.asList(fieldEnum.localEnumList()).contains(name)) {errorMsgList.add(name + "不是枚举值,请按照枚举填写");}}if(StrUtil.isNotEmpty(fieldEnum.type())){// 数据库查询校验if (fieldEnum.isEnumGroup()) {String[] split = name.split(",");for (String item : split) {if (!checkIsEnum(fieldEnum.type(), item)) {errorMsgList.add(item + "不是枚举值,请按照枚举填写");}}} else {if (!checkIsEnum(fieldEnum.type(), name)) {errorMsgList.add(name + "不是枚举值,请按照枚举填写");}}}}private static boolean checkIsEnum(String type, String name) {JdbcTemplate jdbcTemplate = SpringUtil.getBean(JdbcTemplate.class);String sql = "select count(1) from PL_ENUMERATION where TYPE = ? and NAME = ? and STATEFLAG = 0";return jdbcTemplate.queryForObject(sql, Integer.class, type, name) > 0;}
}

3. 在数据模型中使用注解

在需要进行枚举值校验的字段上添加FieldEnum注解。

@Data
public class ImporTaskDTO {/*** 任务状态*/@NotEmpty(message = "任务状态不能为空")@FieldEnum(localEnumList = {"施工中,未提交完工", "提交送审", "已提交完工未送审"})@ExcelProperty("任务状态【必填】")private String taskStatus;/*** 是否有问题*/@FieldEnum(localEnumList = {"是", "否"})@NotEmpty(message = "是否有问题不能为空")@ExcelProperty("是否有问题【必填】")private String existsProblem;/*** 问题重要程度*/@FieldEnum(type = "PROBLEM_LEVEL", isEnumGroup = false)private String problemLevel;/*** 检查方式*/@NotEmpty(message = "检查方式不能为空")@ExcelProperty("检查方式【必填】")private String checkType;}

4. 在业务逻辑中调用校验方法

在导入Excel数据的方法中调用ValidateUtil.validateEnum方法进行校验。

    @Overridepublic List<QualityManageOrder> analysisExcel(MultipartFile file) {List<ImportTaskDTO> dataList = new ArrayList<>();try {EasyExcel.read(file.getInputStream(), ImportQualityManageTaskDTO.class, new PageReadListener<ImportTaskDTO>(readList -> {dataList.addAll(readList);})).sheet().doRead();} catch (IOException e) {throw new CustomException("读取文件失败");}// 校验数据,并且填充基本任务数据ValidateUtil.validateEnum(dataList);// 其他业务逻辑...return orderList;}

通过以上步骤,我们就可以使用自定义注解实现Excel数据导入时的枚举值校验。这样不仅提高了代码的可维护性,还使得代码更加简洁和易读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ffmpeg+openGL ES实现的视频编辑工具-opengl相关逻辑(五)

在我们的项目中,OpenGL ES 扮演着至关重要的角色,其主要功能是获取图像数据,经过一系列修饰后将处理结果展示到屏幕上,以此实现各种丰富多样的视觉效果。为了让大家更好地理解后续知识,本文将详细介绍 OpenGL 相关代码。需要注意的是,当前方案将对 OpenGL 的所有操作都集…

dify安装

官网教程 https://github.com/langgenius/dify/blob/main/README_CN.md 1、下载源码 git clone https://github.com/langgenius/dify.git 2、进入docker目录 cd dify cd docker cp .env.example .env修改nginx对外端口配置 修改为9000 最后执行&#xff1a;docker compo…

前端导出word文件,并包含导出Echarts图表等

基础导出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …

【ETL】从理论到Python实践的数据处理

引言 ETL&#xff08;Extract, Transform, Load&#xff09;是一种数据处理过程&#xff0c;用于将数据从一个或多个源提取出来&#xff0c;进行清洗、转换和整合&#xff0c;然后加载到目标数据仓库或数据库中。ETL 是数据仓库和数据分析领域中不可或缺的一部分&#xff0c;广…

若依Flowable工作流版本监听器使用方法

1.前言 本文详细介绍如何在若依Flowable工作流版本&#xff08;RuoYi-Vue-Flowable&#xff09;中配置执行监听器和任务监听器。是以我二次开发的代码为基础&#xff0c;介绍如何配置监听器&#xff0c;已解决源码在新增或删除监听器出现的问题&#xff0c;如果需要二次开发的…

纷析云开源版- Vue2-增加字典存储到localStorage

main.js //保存字典数据到LocalStorage Vue.prototype.$api.setting.SystemDictType.all().then(({data}) > {loadDictsToLocalStorage(data) })新增 dictionary.js 放在 Utils文件夹里面 // 获取字典数据 export function getDictByType(dictType) {const dicts JSON.par…

jQuery UI CSS 框架 API

jQuery UI CSS 框架 API 概述 jQuery UI 是一个基于 jQuery 的用户界面和交互库,它提供了一套丰富的交互组件和视觉效果,旨在帮助开发者快速构建具有吸引力和互动性的网页应用。jQuery UI CSS 框架 API 是 jQuery UI 的一部分,它允许开发者通过简单的 CSS 类来控制 UI 组件…

VSCode自定义快捷键和添加自定义快捷键按键到状态栏

VSCode自定义快捷键和添加自定义快捷键按键到状态栏 &#x1f4c4;在VSCode中想实现快捷键方式执行某些指令操作&#xff0c;可以通过配置组合式的键盘按键映射来实现&#xff0c;另外一种方式就是将执行某些特定的指令嵌入在面板菜单上&#xff0c;在想要执行的时候&#xff0…

【C语言】指针(5)

前言&#xff1a;上篇文章的末尾我们使用了转移表来解决代码冗余的问题&#xff0c;那我们还有没有什么办法解决代码冗余呢&#xff1f;有的这就是接下来要说的回调函数。 往期文章: 指针1 指针2 指针3 指针4 文章目录 一&#xff0c;回调函数二&#xff0c;qsort实现快速排序1…

【python】网页批量转PDF

安装wkhtmltopdf 网站&#xff1a;wkhtmltopdf wkhtmltopdf http://www.baidu.com/ D:website1.pdf 安装pdfkit库 pip install pdfkit 批量转换代码 import os import pdfkit path_wkthmltopdf rE:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe config pdfkit.configu…

游戏引擎学习第113天

仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板&#xff1a;优化的基本过程 在游戏编程中&#xff0c;优化是一个非常重要的学习内容&#xff0c;尤其是想要成为专业开发者时。优化的核心是理解代码的执行速度&#xff0c;以及如何提升其性能。在这个阶段&#xff0c;已经…

通义灵码AI程序员

通义灵码是阿里云与通义实验室联合打造的智能编码辅助工具&#xff0c;基于通义大模型技术&#xff0c;为开发者提供多种编程辅助功能。它支持多种编程语言&#xff0c;包括 Java、Python、Go、TypeScript、JavaScript、C/C、PHP、C#、Ruby 等 200 多种编码语言。 通义灵码 AI…

SeaTunnel社区「Demo方舟计划」首期活动上线—— MySQL CDC实时同步至PostgreSQL实战

引言 凌晨2点&#xff0c;某电商公司的数据工程师小李正对着屏幕抓狂——业务部门临时要求将MySQL的订单表实时同步到PostgreSQL进行分析&#xff0c;众所周知&#xff0c;在数据驱动的业务场景中&#xff0c;异构数据源同步是高频刚需。 以MySQL到PostgreSQL的CDC同步为例&a…

iNeuOS工业互联网操作系统,民爆远程运维平台案例

iNeuOS工业互联网操作系统,民爆远程运维平台案例 目 录 1. 概述... 2 2. iNeuOS在民爆生产厂区和北京运维中心配置... 3 1.1 生产厂区配置... 3 1.2 运维中心配置... 7 1. 概述 针对本项目进行初步调研,项目的总体需求为满足新建…

利用websocket检测网络连接稳定性

浏览器中打开F12&#xff0c;控制台中输入以下内容 > 回车 > 等待结果 连接关闭 表示断网 let reconnectDelay 1000; // 初始重连间隔 let pingInterval null; let socketManuallyClosed false; // 标志是否手动关闭function createWebSocket() {if (socketManuallyCl…

Unity shader glsl着色器特效之 模拟海面海浪效果

一个简单的海浪效果&#xff0c;通过波的叠加实现水面起伏的动效&#xff0c;根据波峰斜率来为浪花着色&#xff0c;再根据法线贴图和水花贴图来和调整uv的平滑移动来增强海浪移动的细节。如果需要更逼真的效果可以考虑在满足浪花触发的地方添加粒子系统 前置效果图 因为是很久…

智能经济与个人智能助理有什么发展

智能经济与个人智能助理有什么发展 技术融合创新 研究个人助理与新兴技术&#xff08;如量子计算、边缘计算&#xff09;融合&#xff0c;分析对智能经济的推动作用。探索量子计算提升数据处理速度&#xff0c;边缘计算降低延迟&#xff0c;提升个人助理性能的机制&#xff0…

spring日志

前言 入门 这些就是日志 现在开始使用一下 spring是集合了日志的 注意选这个 这样我们就创建好了一个日志对象了 我们就可以这样打印日志了 日志和普通的打印消息相比&#xff0c;区别就是多个一些时间之类的消息 从左到右分别是时间&#xff0c;级别&#xff0c;PID&#x…

整合Salesmart/WhatsApp、开源Odoo模块和Deepseek AI能力,实现针对国外客户的智能客服和个性化推荐服务

一、项目背景 本文提出了一套针对软管制造公司的智能客服与个性化推荐系统实施方案&#xff0c;旨在通过整合开源Odoo模块、Salesmart/WhatsApp以及Deepseek AI能力&#xff0c;打造一个724小时不间断服务的智能化平台&#xff0c;专注于服务国外客户。方案围绕实现不间断服务…