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

用自定义注解实现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数据导入时的枚举值校验。这样不仅提高了代码的可维护性,还使得代码更加简洁和易读。

相关文章:

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

使用自定义注解实现Excel数据导入中的枚举值校验 在实际开发中&#xff0c;我们经常需要从Excel文件中导入数据&#xff0c;并且这些数据需要符合一定的规则&#xff0c;比如某些字段的值必须是预定义的枚举值。本文将介绍如何使用自定义注解来实现这一功能&#xff0c;以提高…...

网络安全技术pat实验 网络安全 实验

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 网络安全实验3 前言Kali 常用指令工具教程 ettercap 基本使用 一、口令破解 John the ripper 破解 linux 密码l0phtcrack7 破解 windows 密码John 破解 zip 压…...

4、IP查找工具-Angry IP Scanner

在前序文章中&#xff0c;提到了多种IP查找方法&#xff0c;可能回存在不同场景需要使用不同的查找命令&#xff0c;有些不容易记忆&#xff0c;本文将介绍一个比较优秀的IP查找工具&#xff0c;可以应用在连接树莓派或查找IP的其他场景中。供大家参考。 Angry IP Scanner下载…...

1018. 锤子剪刀布 (20)-PAT乙级真题

题目来源&#xff1a; PTA | 程序设计类实验辅助教学平台 代码实现&#xff08;代码一&#xff09;&#xff1a; 这个版本是自己写的&#xff1b;&#xff08;很好理解&#xff0c;但定义了很多变量&#xff09;&#xff0c;有部分样例测试不通过 #include <iostream>…...

MyBatis 中 SqlMapConfig 配置文件详解

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 configuration&#xff1a;包裹所有配置标签&#xff0c;是整个配置文件的顶级标签。 properties&#xff1a;属性&#xff0c;该标签可以引入外部配置的属性&#xff…...

复杂项目中的多级WBS应该如何分解?

如果你曾经参与过一个复杂的项目&#xff0c;或许就会感受到&#xff1a; 任务繁杂、责任不清、进度难追踪&#xff0c; 真的是每一位项目经理的噩梦。 而这一切的根源&#xff0c;往往就是缺少一个清晰、有效的任务分解结构—— 没有把庞大、复杂的工作拆解得足够明确&…...

红蓝对抗之常见网络安全事件研判、了解网络安全设备、Webshell入侵检测

文章目录 ​​研判&#xff08;入侵检测&#xff09;​​ ​​设备​​ ​​经典网络​​​​云网络​​ ​​异常HTTP请求​​​​Webshell分析​​ ​​Webshell 的分类​​​​Webshell 的检测​​ ​​主机层面​​​​流量层面​​ ​​附录​​ ​​常见端口漏洞…...

使用 CodeMirror 6 实现插入文本及替换选中文本功能

本文将通过具体的代码示例&#xff0c;详细解释如何在 Vue3 中使用 CodeMirror 6 实现文本插入功能&#xff0c;包括在光标位置插入文本和选中文本插入文本的代码示例&#xff0c;以及这两种插入方式的区别。 1. 只能在光标位置插入文本 1.1 代码示例 const insertTemplate …...

Huatuo热更新--如何使用

在安装完huatuo热更新插件后就要开始学习如何使用了。 1.创建主框渐Main 新建文件夹Main&#xff08;可自定义&#xff09;&#xff0c;然后按下图创建文件&#xff0c;注意名称与文件夹名称保持一致 然后新建场景&#xff08;Init场景&#xff09;&#xff0c;添加3个空物体…...

Flask实现高效日志记录模块

目录 一. 简介&#xff1a; 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建&#xff08;包含日志记录的关键字段&#xff09; 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…...

scroll、offset、client三大家族和getBoundingClientRect方法

scroll、offset、client三大家族和getBoundingClientRect方法 1.offset(只能读,不能修改&#xff09;2.client(只能读,不能修改&#xff09;3.scroll滚动家族4.getBoundingClientRect方法 1.offset(只能读,不能修改&#xff09; offsetParent:离当前元素最近的有定位的祖先元素…...

JWT 令牌

目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言&#xff1a; 在现代Web应用和微服务架构中&#xff0c;用户身份验证和信息安全传输是核心问题。JSON Web Token&#xff08;J…...

Python基于Flask的豆瓣Top250电影数据可视化分析与评分预测系统(附源码,技术说明)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…...

JavaScript数组-遍历数组

在JavaScript中&#xff0c;数组是一种非常常用的数据结构&#xff0c;用于存储一系列有序的数据项。无论是处理简单的列表还是复杂的数据集合&#xff0c;遍历数组都是我们经常需要执行的操作之一。本文将详细介绍几种常见的遍历数组的方法&#xff0c;并讨论它们各自的优缺点…...

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …...

解决DeepSeek服务器繁忙的有效方法

全球42%的企业遭遇过AI工具服务器过载导致内容生产中断&#xff08;数据来源&#xff1a;Gartner 2025&#xff09;。当竞品在凌晨3点自动发布「智能家居安装指南」时&#xff0c;你的团队可能正因DeepSeek服务器繁忙错失「净水器保养教程」的流量黄金期⏳。147SEO智能调度系统…...

分词器(Tokenizer) | 有了分词器,为什么还需要嵌入模型

文章目录 什么是tokenizer有了分词器&#xff0c;为什么还需要嵌入模型分词器为什么在transformers 里Hugging Face的Tokenizer大模型不同tokenizer训练效果对比分词器库选择当前顶尖大模型所采用的 Tokenizer 方法与词典大小 参考 什么是tokenizer Tokenizers huggingface官方…...

VisionTransformer(ViT)与CNN卷积神经网络的对比

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

计算机视觉+Numpy和OpenCV入门

Day 1&#xff1a;Python基础Numpy和OpenCV入门 Python基础 变量与数据类型、函数与类的定义、列表与字典操作文件读写操作&#xff08;读写图像和数据文件&#xff09; 练习任务&#xff1a;写一个Python脚本&#xff0c;读取一个图像并保存灰度图像。 import cv2 img cv2.im…...

Vue 3 工程化打包工具:从理论到实践 (下篇)

引言 在前端开发中&#xff0c;打包工具是工程化的重要组成部分。Vue 3 作为当前流行的前端框架&#xff0c;其工程化离不开高效的打包工具。打包工具不仅能够将代码、样式、图片等资源进行优化和压缩&#xff0c;还能通过模块化、代码分割等功能提升应用的性能。本文将深入探…...

终极屏幕翻译神器:Translumo让你的Windows电脑瞬间打破语言壁垒

终极屏幕翻译神器&#xff1a;Translumo让你的Windows电脑瞬间打破语言壁垒 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo …...

2026年爆款实测 | 哪些降重软件可以同时降低查重率和AIGC疑似率?高效论文降重方案:TOP10平台功能对比与选择建议(推荐一些可以用于论文降重的软件)

【CSDN博主摘要】 每年五月&#xff0c;CSDN的私信都要被即将毕业的硕博生们挤爆。大家都在问一个极其现实且焦虑的问题&#xff1a;“现在的机器检测太变态了&#xff0c;到底推荐一些可以用于论文降重的软件&#xff1f;到底哪些降重软件可以同时降低查重率和AIGC疑似率&…...

5分钟终极指南:用Win11Debloat让你的Windows 11系统焕然一新

5分钟终极指南&#xff1a;用Win11Debloat让你的Windows 11系统焕然一新 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter …...

顺时调养清火气,安稳度春日

春回大地&#xff0c;万物复苏&#xff0c;气温起伏不定&#xff0c;风燥渐盛。此时阳气升发&#xff0c;人体内积热容易随之涌动&#xff0c;加上日常作息紊乱、饮食偏于辛辣油腻&#xff0c;很容易出现咽喉肿痛、口干舌燥、心烦燥热、轻微上火感冒等不适&#xff0c;春日养生…...

Postman调试海康ISAPI接口全记录:从鉴权到改设备名,一次搞定

Postman调试海康ISAPI接口实战指南&#xff1a;从零掌握设备管理全流程 海康威视设备的ISAPI接口作为设备管理的核心通道&#xff0c;为开发者提供了丰富的控制能力。但面对复杂的鉴权机制和XML数据交互&#xff0c;不少开发者仍感到无从下手。本文将带你用Postman这把"瑞…...

别再乱画UML了!用包图整理你的用例图和类图,让项目结构一目了然

用UML包图重构项目架构&#xff1a;从混乱到清晰的实战指南 当你的代码库膨胀到几十万行&#xff0c;当每次需求变更都引发连锁反应&#xff0c;当新成员需要三个月才能摸清模块边界——是时候重新审视项目的组织结构了。UML包图就像软件架构的GPS导航系统&#xff0c;它能将散…...

ARMv9内存管理:TCR2寄存器详解与优化实践

1. ARMv9内存管理架构概述在ARMv9架构中&#xff0c;内存管理单元(MMU)作为处理器核心组件&#xff0c;负责虚拟地址到物理地址的转换。与ARMv8相比&#xff0c;ARMv9在内存管理方面引入了多项增强特性&#xff0c;其中最重要的变化之一就是新增了TCR2扩展寄存器系列。这些寄存…...

为什么92%的车载以太网项目DoIP协议栈延期交付?C++底层设计缺陷深度复盘(含可运行参考实现)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DoIP协议栈延期交付的行业现状与根本归因 行业交付延迟的普遍性表现 当前&#xff0c;超过68%的汽车电子供应商在DoIP&#xff08;Diagnostics over Internet Protocol&#xff09;协议栈项目中遭遇交…...

3步解决音乐歌词获取难题:163MusicLyrics歌词提取工具实战指南

3步解决音乐歌词获取难题&#xff1a;163MusicLyrics歌词提取工具实战指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为找不到心爱歌曲的歌词而烦恼吗&#xff…...

如何快速激活Windows系统:KMS_VL_ALL_AIO智能激活工具终极指南

如何快速激活Windows系统&#xff1a;KMS_VL_ALL_AIO智能激活工具终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活而烦恼吗&#xff1f;KMS_VL_ALL_AIO是一款基于…...