SpringBoot數據字典字段自動生成對應code和desc

效果:接口會返回orderType,但是這個orderType是枚舉的類型(1,2,3,4),我想多返回一個orderTypeDesc給前端展示,這樣前端就可以直接拿orderTypeDesc使用了。

1. 定義注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
//作用是將當前類上的注解也追加到目標類上,如果不加的話,目標類及時加了@EnumTranslation注解,也不會集成該注解的所有注解
@JacksonAnnotationsInside
@JsonSerialize(using = EnumTranslationSerialize.class)
public @interface EnumTranslation {//生成的屬性名,不寫默認原名+DescString generateFieldName() default "";//參考的枚舉,會根據改枚舉的code獲取對應的descClass<? extends Enum<?>> targetEnum() ;
}

2. 定義EnumTranslationSerialize類

EnumTranslationSerialize繼承了JsonSerializer,實現了ContextualSerializer,用于序列化時多生成一個字段返回。

ContextualSerializer的作用:為了在序列化時獲取屬性上的注解信息,然后根據注解信息重新創建EnumTranslationSerialize來序列化,這樣就能根據注解的配置來序列化了。

@Slf4j
public class EnumTranslationSerialize<E> extends JsonSerializer<Object> implements ContextualSerializer {private String targetFieldName;private LinkedHashMap<String, String> enumMap;public EnumTranslationSerialize() {//需要空構造方法,請勿刪除}/*** 構造方法,獲取當前屬性名,生成的屬性名,目標枚舉*/public EnumTranslationSerialize(String fieldName, String targetFieldName, Class enumClass) {if (StringUtils.isNotBlank(targetFieldName)) {this.targetFieldName = targetFieldName;} else {this.targetFieldName = fieldName + "Name";}enumMap = new LinkedHashMap<>();try {Method getCode = enumClass.getMethod("getCode");Method getDesc = enumClass.getMethod("getDesc");for (Object everyEnum : EnumUtil.getEnumMap(enumClass).values()) {enumMap.put(getCode.invoke(everyEnum).toString(), getDesc.invoke(everyEnum).toString());}} catch (Exception e) {log.error(ExceptionUtils.getStackTrace(e));}}/*** 序列化規則*/@Overridepublic void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {if (Objects.isNull(o)) {return;}try {String codeValue = o.toString();jsonGenerator.writeString(codeValue);String value = enumMap.get(codeValue);//多寫入一個屬性if (Objects.nonNull(value)) {jsonGenerator.writeFieldName(this.targetFieldName);jsonGenerator.writeObject(value);}} catch (Exception e) {log.error(ExceptionUtils.getStackTrace(e));}}/*** ContextualSerializer接口的方法,作用是獲取屬性上的枚舉*/@Overridepublic JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException {if (beanProperty != null) {EnumTranslation t = beanProperty.getAnnotation(EnumTranslation.class);if (t != null) {return new EnumTranslationSerialize<>(beanProperty.getName(), t.targetFieldName(), t.enumC());}}return serializerProvider.findNullValueSerializer(beanProperty);}
}

3. 使用

@Data
public class OrderVO {@Schema(description = "訂單類型")@EnumTranslation(generateFieldName = "orderTypeDesc", enumC = OrderType.class)private Long orderType;
}

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

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

相關文章

【YashanDB知識庫】imp導入數據庫時,報錯YAS-08023

本文內容來自YashanDB官網&#xff0c;原文內容請見 https://www.yashandb.com/newsinfo/7849010.html?templateId1718516 **【問題分類】**數據導入導出 **【關鍵字】**imp、YAS-08023 【問題描述】 導出數據庫時&#xff0c;使用以下命令&#xff0c;導出正常&#xff1…

又一年。。。。。。

2024&#xff0c;渾渾噩噩的一年。 除了100以內的加減法&#xff08;數據&#xff0c;數據&#xff0c;還是數據。。。。。。&#xff09;&#xff0c;似乎沒做些什么。 臉盲癥越來越重的&#xff0c;怕是哪天連自己都不認得自己的了。 看到什么&#xff0c;聽到什…

FreeRTOS: ISR(中斷服務例程)和 TCB(任務控制塊)

在討論 ISR&#xff08;中斷服務例程&#xff09;和 TCB&#xff08;任務控制塊&#xff0c;Task Control Block&#xff09;時&#xff0c;我們實際上是在探討 FreeRTOS 中兩個不同但又相互關聯的概念&#xff1a;一個是用于處理硬件或軟件觸發的中斷事件&#xff0c;另一個是…

GoldenDB組件及對應的用戶和進程

1. GoldenDB組件及對應的用戶和進程 GoldenDB數據庫由管理節點、全局事務節點GTM、計算節點CN、數據節點DN等組成。 1.1. 管理節點 管理節點分為集群管理、Insight運維管理平臺&#xff08;InsightServer、RDB、ZK&#xff09;。 1.1.1. 集群管理 1. 集群管理包括Metadatas…

OpenStack系列第四篇:云平臺基礎功能與操作(Dashboard)

文章目錄 1. 鏡像&#xff08;Image&#xff09;添加鏡像查看鏡像刪除鏡像 2. 卷&#xff08;Volume&#xff09;創建卷查看卷刪除卷 3. 網絡&#xff08;虛擬網絡&#xff09;創建網絡查看網絡刪除網絡 4. 實例類型創建實例類型查看實例類型刪除實例類型 4. 密鑰對&#xff08…

CSDN編輯器

這里寫自定義目錄標題 歡迎使用Markdown編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右SmartyPants 創建一個自定義列表如何創建一個…

MTK 平臺關于WIFI 6E P2P的解說

一 前言 官方 P2P 6E 設計原理,請查看這個網站 hostap - hostapd/wpa_supplicant 配置:p2p_6ghz_disable 允許上層指定是否允許6G連接 僅允許6G用于WFD –不允許6G用于純P2P 缺點:存在很多 IOT issues 如:一些物聯網設備無法識別6G類/信道,可能存在物聯網問…

四大自平衡樹對比:AVL樹、紅黑樹、B樹與B+樹

AVL樹、紅黑樹、B樹和B樹的對比與應用場景 樹系列相關文章&#xff08;置頂&#xff09; 1、從鏈表到平衡樹&#xff1a;二叉查找樹的退化與優化 2、自平衡二叉查找樹&#xff1a;如何讓二叉查找樹始終保持高效 3、AVL樹入門&#xff1a;理解自平衡二叉查找樹的基礎 4、紅黑樹全…

Linux下讀取Windows下保存的文件,報錯信息中出現“^M“時如何解決?【由于Windows和Linux的換行方式不同造成的-提供兩種轉換方式】

Windows 和 Linux 的文本文件使用的換行符不同&#xff1a; Windows 使用 \r\n &#xff08;回車 換行&#xff09;。Linux 使用 \n &#xff08;換行&#xff09;。 因此&#xff0c;當在 Linux 系統上運行帶有 Windows 換行符的腳本或讀取相關文件時&#xff0c;可能會出現…

簡易內存池(下)

提示&#xff1a;文章 文章目錄 前言一、背景二、2.1Ace代碼 三、3.1 總結 前言 前期疑問&#xff1a; 本文目標&#xff1a; 一、背景 最近 二、 2.1 Ace代碼 Aced代碼形式如下 #include <stdbool.h> #include <stdio.h> #include <malloc.h> #inclu…

npm ERR! ECONNRESET 解決方法

問題&#xff1a;npm 命令遇到的錯誤是 ECONNRESET&#xff0c;這通常與網絡連接問題相關。設置代理解決問題。 一、查看當前代理設置 npm config get proxy npm config get https-proxy二、設置代理 npm config set proxy http://your-proxy-address:port npm config set h…

【UE5】UnrealEngine源碼構建2:windows構建unreal engine 5.3.2

參考大神知乎的文章:UE5 小白也能看懂的源碼編譯指南 據說會耗費400G的空間。 代碼本身并不大,可能是依賴特別多,畢竟看起來UE啥都能干,核心還是c++的, 【UE5】UnrealEngine源碼構建1:tag為5.3.2源碼clone 本著好奇+ 學習的態度,想著也許有機會能更為深入的熟悉UE的機制…

Day60 圖論part10

今天大家會感受到 Bellman_ford 算法系列在不同場景下的應用。 建議依然是:一刷的時候,能理解 原理,知道Bellman_ford 解決不同場景的問題 ,照著代碼隨想錄能抄下來代碼就好,就算達標。 二刷的時候自己嘗試獨立去寫,三刷的時候 才能有一定深度理解各個最短路算法。 Bell…

在Linux上獲取MS(如Media Server)中的RTP流并錄制為雙軌PCM格式的WAV文件

在Linux上獲取MS(如Media Server)中的RTP流并錄制為雙軌PCM格式的WAV文件 一、RTP流與WAV文件格式二、實現步驟三、偽代碼示例四、C語言示例代碼五、關鍵點說明六、總結在Linux操作系統上,從媒體服務器(如Media Server,簡稱MS)獲取RTP(Real-time Transport Protocol)流…

Vue3 簡介

Vue3 簡介 最新版本&#xff1a; v3.5.13 1、性能提升 打包大小減少 41% - 初次渲染快 55%, 更新渲染快 133%內存減少 54% 2、源碼的升級 使用 Proxy 代替 defineProperty 實現響應式。重寫虛擬 DOM 的實現和 Tree-Shaking 3、擁抱TypeScript Vue3 可以更好的支持 TypeSc…

打造RAG系統:四大向量數據庫Milvus、Faiss、Elasticsearch、Chroma 全面對比與選型指南

在當今信息爆炸的時代&#xff0c;檢索增強生成&#xff08;Retrieval-Augmented Generation&#xff0c;簡稱RAG&#xff09;系統已成為自然語言處理&#xff08;NLP&#xff09;領域的重要工具。RAG 系統通過結合生成模型和信息檢索技術&#xff0c;能夠在大規模數據中高效地…

檢索增強生成(RAG):大語言模型的創新應用

近年來,隨著自然語言處理(NLP)技術的不斷發展,大型語言模型(Large Language Models, LLMs)在文本生成、對話系統等任務中展現出卓越的性能。然而,由于模型參數和訓練數據的靜態性,它們難以生成包含實時或領域特定信息的高質量文本。為解決這一局限性,檢索增強生成(Re…

Oracle Dataguard(主庫為 Oracle 11g 單節點)配置詳解(1):Oracle Dataguard 概述

Oracle Dataguard&#xff08;主庫為 Oracle 11g 單節點&#xff09;配置詳解&#xff08;1&#xff09;&#xff1a;Oracle Dataguard 概述 目錄 Oracle Dataguard&#xff08;主庫為 Oracle 11g 單節點&#xff09;配置詳解&#xff08;1&#xff09;&#xff1a;Oracle Data…

北京某新能源汽車生產及辦公網絡綜合監控項目

北京某新能源汽車是某世界500強汽車集團旗下的新能源公司&#xff0c;也是國內首個獲得新能源汽車生產資質、首家進行混合所有制改造、首批踐行國有控股企業員工持股的新能源汽車企業&#xff0c;其主營業務包括純電動乘用車研發設計、生產制造與銷售服務。 項目現狀 在企業全…

大數據系列之:深入理解學習使用騰訊COS和COS Ranger權限體系解決方案,從hdfs同步數據到cos

大數據系列之&#xff1a;深入理解學習使用騰訊COS和COS Ranger權限體系解決方案&#xff0c;從hdfs同步數據到cos 對象存儲COS對象存儲基本概念COS Ranger權限體系解決方案部署組件COS Ranger Plugin部署COS-Ranger-Service部署COS Ranger Client部署 COSN 從hdfs同步數據到co…