Easy-Trans反向翻譯+Excel導入最佳實踐

1、概述

?實現用戶excel上傳、解析、對于用戶輸入的中文翻譯為字典碼或者id,實現用戶輸入的參數校驗,最后入庫。如果用戶輸入的參數有問題,返回校驗結果給前端。

excel解析使用My-Excel組件,校驗使用hibernate-validator,反向翻譯組件使用easy-trans。

2、maven

?不一定使用我指定的版本,也可以使用其他的替代組件,本文主要是給大家一個思路。

<!--請注意,如果用的新版本要用org.dromara的groupId untrans-driver需要和easy-trans主版本保持一致 -->
<dependency><groupId>com.fhs-opensource</groupId><artifactId>easy-trans-untrans-driver</artifactId><version>2.2.15</version>
</dependency><!--解析excel的插件,也可以使用easy-excel --><dependency><groupId>com.github.liaochong</groupId><artifactId>myexcel</artifactId><version>4.4.2</version></dependency><!--參數校驗插件 -->
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.2.5.Final</version>
</dependency>

3、校驗插件代碼

?首先自定義2個分組,第一個分組是對用戶的必填和格式校驗,第二個分組是對用戶填寫的數據反向翻譯后,判斷是否正常的校驗(比如字典 有男女? 他給個TS肯定翻譯不到value,也要報錯)。

public class ValidationGroups {public ValidationGroups() {}/*** excel導入第一遍監察*/public @interface excelImportFirst {}/*** excel導入第二遍監察*/public @interface excelImportSecond {}}

接著自定義參數校驗工具類

public class ValidateUtil {private static final Validator validator =Validation.buildDefaultValidatorFactory().getValidator();/*** 通過組來校驗實體類*/public static <T> String validate(T t, Class<?>... groups) {Set<ConstraintViolation<T>> constraintViolations = validator.validate(t, groups);if (constraintViolations.size() > 0) {StringBuilder validateError = new StringBuilder();for (ConstraintViolation<T> constraintViolation : constraintViolations) {validateError.append(constraintViolation.getMessage()).append(";");}return validateError.toString();}return null;}/*** 通過組來校驗實體類*/public static <T> String validate(List<T> objs, Class<?>... groups) {StringBuilder validateError = new StringBuilder();boolean hasError = false;for (int i = 0; i < objs.size(); i++) {String result = validate(objs.get(i),  groups);if(result!=null){validateError.append("第" + (i+1) + "行:" + result);hasError = true;}}return hasError ? validateError.toString() : null;}}

4、easy-trans的yml配置

主要配置上db-type? 支持mysql和postgresql

easy-trans:#啟用redis緩存 如果不用redis請設置為falseis-enable-redis: true#啟用全局翻譯(攔截所有responseBody進行自動翻譯),如果對于性能要求很高可關閉此配置is-enable-global: true#啟用平鋪模式is-enable-tile: true#字典緩存放到redis 微服務模式請開啟dict-use-redis: true      #數據庫類型指定,反向翻譯使用      db-type: mysql

5、新增pojo,用于接收excel的數據

? 支持組合唯一鍵,比如? ?財務部的王磊? 財務部是org表的name? 王磊是user表的name。

?比如:下面類里面的 domainId

?支持字典反向翻譯,比如男女之類的 ,下面類里面的modelType

?當然也支持表里面的唯一鍵,比如身份證號碼,手機號等。下面類里面的layeringId

package com.xhb.data.center.dgp.api.excel;import com.fhs.core.trans.anno.UnTrans;
import com.fhs.core.trans.constant.UnTransType;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.xhb.data.center.api.validate.ValidationGroups;
import lombok.Data;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.NotBlank;
import java.util.ArrayList;
import java.util.List;/*** 模型表excel導入POJO*/
@Data
public class ModelingLogicalTableImport {@NotBlank(message = "業務主題名稱不能為空",groups = {ValidationGroups.excelImportFirst.class})@ExcelColumn(title = "主題域(*)")private String subjectName;@NotBlank(message = "主題域名稱不能為空",groups = {ValidationGroups.excelImportFirst.class})@ExcelColumn(title = "業務主題(*)")private String domainName;@NotBlank(message = "數倉分層名稱不能為空",groups = {ValidationGroups.excelImportFirst.class})@ExcelColumn(title = "數倉分層名稱(*)")private String layeringName;@NotBlank(message = "doris集群名稱不能為空",groups = {ValidationGroups.excelImportFirst.class})@ExcelColumn(title = "集群名稱(*)")private String clusterName;@NotBlank(message = "doris庫名稱不能為空",groups = {ValidationGroups.excelImportFirst.class})@ExcelColumn(title = "所在庫(*)")private String databaseName;@NotBlank(message = "模型中文名稱不能為空",groups = {ValidationGroups.excelImportFirst.class})@Length(max = 64,message = "模型中文名稱不能超過{max}位",groups = {ValidationGroups.excelImportFirst.class})@ExcelColumn(title = "中文名稱(*)")private String chName;@NotBlank(message = "模型英文名稱不能為空",groups = {ValidationGroups.excelImportFirst.class})@Length(max = 64,message = "模型英文名稱不能超過{max}位",groups = {ValidationGroups.excelImportFirst.class})@ExcelColumn(title = "英文名稱(*)")private String enName;@ExcelColumn(title = "數據模型(*)")private String modelTypeName;@ExcelColumn(title = "副本數(*)")private Integer replicationNum;@ExcelColumn(title = "事實表類型(*)")private String factTableTypeName;@ExcelColumn(title = "業務過程中文名稱(*)")private String processName;@ExcelColumn(title = "模型描述")private String description;@NotBlank(message = "集群匹配不到數據",groups = {ValidationGroups.excelImportSecond.class})@UnTrans(type = UnTransType.SIMPLE,refs = {"clusterName", "databaseName"},tableName = "dgp_warehouse_doris_cluster c join dgp_warehouse_doris_database d on c.id=d.cluster_id",columns = {"c.name", "d.database_name"},uniqueColumn = "d.id")private String clusterDatabaseId;@NotBlank(message = "主題域匹配不到數據",groups = {ValidationGroups.excelImportSecond.class})@UnTrans(type = UnTransType.SIMPLE,refs = {"subjectName", "domainName"},tableName = "dgp_warehouse_plan_subject s join dgp_warehouse_plan_domain d on s.id=d.subject_id",columns = {"s.name", "d.name"},uniqueColumn = "d.id")private String domainId;@NotBlank(message = "數據模型匹配不到數據",groups = {ValidationGroups.excelImportSecond.class})@UnTrans(refs = "modelTypeName", type = UnTransType.DICTIONARY, dict = "dgp_modeling_model_type")private String modelType;@NotBlank(message = "數倉分層匹配不到數據",groups = {ValidationGroups.excelImportSecond.class})@UnTrans(type = UnTransType.SIMPLE,refs = {"layeringName"},tableName = "dgp_warehouse_plan_layering",columns = {"name"})private String layeringId;@UnTrans(type = UnTransType.SIMPLE,refs = {"subjectName", "domainName", "processName"},tableName = "dgp_warehouse_plan_subject s join dgp_warehouse_plan_domain d on s.id=d.subject_id join dgp_modeling_process p",columns = {"s.name", "d.name", "p.ch_name"}, uniqueColumn = "p.id")private String processId;@UnTrans(type = UnTransType.DICTIONARY,refs = {"factTableTypeName"},dict = "dgp_modeling_fact_table_type")private String factTableType;private List<ModelingLogicalColumnImport> columns = new ArrayList<>();
}

6、controller

在controller里面接收文件對象,然后轉換成pojo。我下面的demo是表導入,一次導入多個表,每個表又有多個字段。所以搞了2個sheet,大多數一個sheet就行了。

7、service層代碼

大致思路:先校驗參數,在校驗參數的方法里已經做了反向翻譯了。校驗不通過直接拋異常,校驗通過繼續下面的excel pojo轉po 然后 批量入庫操作。

校驗參數:

1、先進行基礎校驗,判斷必填的是否填寫了,格式是否正確。

2、反向翻譯

3、校驗反向翻譯的結果字段,比如xxid xxType。比如客戶輸入了一個張三,但是沒匹配到張三對應的userid? 客戶輸入了TS 但是字典里只有男女,沒匹配到TS的字典碼 都會在第二次校驗里校驗出來。

4、如果有錯誤,則拋異常,然后全局異常攔截后返回json給前端

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64775.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安裝過程

前言 Nginx WebUI 是一個為 Nginx 提供圖形化管理界面的工具。通過 WebUI&#xff0c;用戶可以輕松管理 Nginx 配置&#xff0c;而無需直接編輯配置文件&#xff0c;尤其適合新手用戶和頻繁修改配置的場景。 官網文檔&#xff1a;nginxWebUI - 文檔 本文將分享為什么選擇 ngin…

SpringCloud源碼-openFeign

LoadBalancer默認只有nacos服務發現器 openFeign與springcloud loadbalancer的結合點 openFeign通過spring cloud loadbalancer進行負載均衡&#xff0c;spring cloud loadbalancer通過discovery client獲取nacos的機器列表&#xff0c;然后底層進行負載均衡。

基于微信小程序的校園自助打印系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了多年的設計程序開發&#xff0c;開發過上千套設計程序&#xff0c;沒有什么華麗的語言&#xff0c;只有實…

從 ELK Stack 到簡單 — Elastic Cloud Serverless 上的 Elastic 可觀察性

作者&#xff1a;來自 Elastic Bahubali Shetti, Chris DiStasio 宣布 Elastic Cloud Serverless 上的 Elastic Observability 正式發布 — 一款完全托管的可觀察性解決方案。 隨著組織規模的擴大&#xff0c;一個能夠處理分布式云環境的復雜性并提供實時洞察的可觀察性解決方…

21.<基于Spring圖書管理系統②(圖書列表+刪除圖書+更改圖書)(非強制登錄版本完結)>

PS&#xff1a; 開閉原則 定義和背景 開閉原則&#xff08;Open-Closed Principle, OCP&#xff09;&#xff0c;也稱為開放封閉原則&#xff0c;是面向對象設計中的一個基本原則。該原則強調軟件中的模塊、類或函數應該對擴展開放&#xff0c;對修改封閉。這意味著一個軟件實體…

三、GIT與Github推送(上傳)和克隆(下載)

GIT與Github推送&#xff08;上傳&#xff09;和克隆&#xff08;下載&#xff09; 一、配置好SSH二、在Github創建倉庫三、git克隆&#xff08;下載&#xff09;文件四、git推送&#xff08;上傳&#xff09;文件到遠程倉庫 一、配置好SSH Git與Github上傳和下載時需要使用到…

網工日記:FTP兩種工作模式的區別

FTP 的主動模式和被動模式在連接建立的發起方、數據傳輸端口以及對網絡環境的適應性等方面存在明顯區別&#xff1a; 1. 連接發起方 主動模式&#xff1a;數據連接由服務器主動發起。在控制連接建立后&#xff0c;客戶端通過 PORT 命令告知服務器自己用于接收數據的臨時端口號…

【數字化】華為一體四面細化架構藍圖

導讀&#xff1a;華為的“一體四面”企業架構設計方法是一種綜合性的管理框架&#xff0c;它通過業務架構、信息架構、應用架構和技術架構的集成設計&#xff0c;構建出一個既符合業務需求&#xff0c;又具備高度靈活性和可擴展性的IT系統。這種架構設計方法強調從業務視角出發…

【linux板卡】lubancat通過vnc遠程訪問桌面

魯班貓開發板通過遠程VNC連接桌面&#xff1a; 硬件&#xff1a;lubancat2&#xff0c;網線 軟件&#xff1a;ssh軟件&#xff0c;vnc viewer 參考鏈接&#xff1a;https://training.eeworld.com.cn/video/38821 1、ssh連接lubancat2 &#xff0c;輸入ifconfig查看ip 2、輸入 …

解決Springboot整合Shiro+Redis退出登錄后不清除緩存

解決Springboot整合ShiroRedis退出登錄后不清除緩存 問題發現問題解決 問題發現 如果再使用緩存管理Shiro會話時&#xff0c;退出登錄后緩存的數據應該清空。 依賴文件如下&#xff1a; <dependency><groupId>org.springframework.boot</groupId><arti…

2024國城杯 Web

這四道題目Jasper大佬都做了鏡像可以直接拉取進行復現 https://jaspersec.top/2024/12/16/0x12%20%E5%9B%BD%E5%9F%8E%E6%9D%AF2024%20writeup%20with%20docker/ n0ob_un4er 這道題沒有復現成功, 不知道為啥上傳了文件, 也在 /tmp目錄下生成了sess_PHPSESSID的文件, 但是就是…

el-input輸入框需要支持多輸入,最后傳輸給后臺的字段值以逗號分割

需求&#xff1a;一個輸入框字段需要支持多次輸入&#xff0c;最后傳輸給后臺的字段值以逗號分割 解決方案&#xff1a;結合了el-tag組件的動態編輯標簽 那塊的代碼 //子組件 <template><div class"input-multiple-box" idinputMultipleBox><div>…

nginx 的 server 塊配置解析

前后端分離&#xff08;前端 flask&#xff09;&#xff1a; # 阻止ip訪問server {# default_server 是一個配置參數&#xff0c;用于指定當請求的域名&#xff08;Host 頭&#xff09;沒有匹配任何 server 塊時&#xff0c;Nginx 應該使用哪個 server 塊來處理這些請求。 lis…

Ubuntu 22.04.5 修改IP

Ubuntu22.04.5使用的是netplan管理網絡&#xff0c;因此需要在文件夾/etc/netplan下的01-network-manager-all.yaml中修改&#xff0c;需要權限&#xff0c;使用sudo vim或者其他編輯器&#xff0c;修改后的內容如下&#xff1a; # Let NetworkManager manage all devices on …

‘vue-cli-service‘ 不是內部或外部命令,也不是可運行的程序 或批處理文件。

這個錯誤信息表示系統找不到 vue-cli-service 命令&#xff0c;通常是因為 Vue 項目沒有正確安裝所需的依賴包。解決這個問題的步驟如下&#xff1a; 1. 確保你已經安裝了依賴 首先&#xff0c;確保你在項目目錄下&#xff0c;并且運行了以下命令來安裝項目所需的依賴&#x…

解決virtualbox克隆ubuntu虛擬機之后IP重復的問題

找遍了國內論壇&#xff0c;沒一個能解決該問題的&#xff0c;所以我自己寫個文章吧&#xff0c;真討厭那些只會搬運的&#xff0c;污染國內論壇環境&#xff0c;搜一個問題&#xff0c;千篇一律。 問題 操作系統版本為"Ubuntu 24.04 LTS" lennytest1:~$ cat /etc…

基于SpringBoot的寵物寄養系統的設計與實現(源碼+SQL+LW+部署講解)

文章目錄 摘 要1. 第1章 選題背景及研究意義1.1 選題背景1.2 研究意義1.3 論文結構安排 2. 第2章 相關開發技術2.1 前端技術2.2 后端技術2.3 數據庫技術 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系統需求分析 4. 第4章 系統概要設計4.1 系統功能模塊設計4.2 數據庫設計 5.…

idea 開發Gradle 項目

在Mac上安裝完Gradle后&#xff0c;可以在IntelliJ IDEA中配置并使用Gradle進行項目構建和管理。以下是詳細的配置和使用指南&#xff1a; 1. 驗證Gradle是否已安裝 在終端運行以下命令&#xff0c;確保Gradle安裝成功&#xff1a; gradle -v如果輸出Gradle版本信息&#xff…

REST與RPC的對比:從性能到擴展性的全面分析

在微服務架構中&#xff0c;服務間通信是核心問題之一。常見的兩種通信方式是REST&#xff08;Representational State Transfer&#xff09;和RPC&#xff08;Remote Procedure Call&#xff09;。它們各有優缺點&#xff0c;適用于不同場景。本文將從性能、擴展性、兼容性和開…

【Linux】:線程安全 + 死鎖問題

&#x1f4c3;個人主頁&#xff1a;island1314 &#x1f525;個人專欄&#xff1a;Linux—登神長階 ?? 歡迎關注&#xff1a;&#x1f44d;點贊 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 1. 線程安全和重入問題&…