用自定義注解實現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.pswp.cn/diannao/70476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70476.shtml
英文地址,請注明出處:http://en.pswp.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;專注于服務國外客戶。方案圍繞實現不間斷服務…