衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MapStruct中的高級特性使用

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-05-26 15:59 ? 次閱讀

事件回顧

分析探討

推薦方案

總結

44ca47fa-fafb-11ed-90ce-dac502259ad0.jpg

前言

最近項目上要求升級一個工具包hutool的版本,以解決安全漏洞問題,這不升級還好,一升級反而捅出了更大的簍子,究竟是怎么回事呢?

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/ruoyi-vue-pro

視頻教程:https://doc.iocoder.cn/video/

事件回顧

我們項目原先使用的hutool版本是5.7.2,在代碼中,我們的數據傳輸對象DTO和數據實體對象中大量使用了工具包中的BeanUtil.copyProperties(), 大體代碼如下:

數據傳輸對象

@Data
@ToString
publicclassDiagramDTO{

//前端生產的字符串id
privateStringid;

privateStringcode;

privateStringname;
}

數據實體對象

@Data
@ToString
publicclassDiagram{

privateIntegerid;

privateStringcode;

privateStringname;
}

業務邏輯

publicclassBeanCopyTest{

publicstaticvoidmain(String[]args){
//前端傳輸的對象
DiagramDTOdiagramDTO=newDiagramDTO();
//如果前端傳入的id事包含e的,升級后就會報錯
diagramDTO.setId("3em3dgqsgmn0");
diagramDTO.setCode("d1");
diagramDTO.setName("圖表");

Diagramdiagram=newDiagram();
//關鍵點,數據拷貝
BeanUtil.copyProperties(diagramDTO,diagram);
System.out.println("數據實體對象:"+diagram);
//設置id為空,自增
diagram.setId(null);
//保存到數據庫中TODO
//diagramMapper.save(diagram);
}
}

升級前,hutool是5.7.2版本下,執行結果如下圖。

44d670de-fafb-11ed-90ce-dac502259ad0.png

BeanUtil.copyProperties雖然字段類型不一樣,但是做了兼容處理,所以業務沒有影響業務邏輯。

升級后,hutool是5.8.8版本,執行結果如下圖所示:

44e28d92-fafb-11ed-90ce-dac502259ad0.png

執行報錯,因為升級后的版本修改了實現,增加了下面的邏輯,如果包含E, 就會拋錯,從而影響了業務邏輯,同時這個id是否包含e又是隨機因素,到了生產才發現,就悲劇了。

44f0d21c-fafb-11ed-90ce-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

項目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

分析探討

我發現大部分人寫代碼都喜歡偷懶,在上面的場景中,雖然BeanUtil.copyProperties用的一時爽,但有時候帶來的后果是很嚴重的,所以很不推薦這種方式。為什么這么說呢?

比如團隊中的某些人偷偷改了數據傳輸對象DTO,比如修改了類型、刪去了某個字段。用BeanUtil.copyProperties的方式壓根無法在編譯階段發現,更別提修改的影響范圍了,這就只能把風險暴露到生產上去了。那有什么更好的方法呢?

推薦方案

原始的get、set方式

我是比較推崇這種做法的,比如現在DiagramDTO刪去某個字段,編譯器就會報錯,就會引起你的注意了,讓問題提前暴露,無處遁形。

44fc19ba-fafb-11ed-90ce-dac502259ad0.png

你可能覺得站著說話不腰疼,字段少好,如果字段很多還不得寫死啊,我這里推薦一個IDEA的插件,可以幫你智能生成這樣的代碼。

450bdb98-fafb-11ed-90ce-dac502259ad0.png45126594-fafb-11ed-90ce-dac502259ad0.png

話不多說,自己玩兒去~~

使用開源庫ModelMapper

ModelMapper是一個開源庫,可以很方便、簡單地將對象從一種類型映射到另一種類型,底層是通過反射來自動確定對象之間的映射,還可以自定義映射規則。

privatestaticvoidtestModelMapper(){
ModelMappermodelMapper=newModelMapper();
DiagramDTOdiagramDTO=newDiagramDTO();
diagramDTO.setId("3em3dgqsgmn0");
diagramDTO.setCode("d1");
diagramDTO.setName("圖表");
Diagramdiagram=modelMapper.map(diagramDTO,Diagram.class);
}

使用開源庫MapStruct

MapStruct也是Java中另外一個用于映射對象很流行的開源工具。它是在編譯階段生成對應的映射代碼,相對于ModelMapper底層放射的方案,性能更好。

@Mapper
publicinterfaceDiagramMapper{
DiagramMapperINSTANCE=Mappers.getMapper(DiagramMapper.class);

DiagramDTOtoDTO(Diagramdiagram);

DiagramtoEntity(DiagramDTOdiagram);
}

privatestaticvoidtestMapStruct(){
DiagramDTOdiagramDTO=newDiagramDTO();
diagramDTO.setId("3em3dgqsgmn0");
diagramDTO.setCode("d1");
diagramDTO.setName("圖表");
Diagramdiagram=DiagramMapper.INSTANCE.toEntity(diagramDTO);
}

DiagramMapper接口使用了@Mapper注解,用來表明使用MapStruct處理

MapStruct中更多高級特性大家自己探索一下。

總結

小結一下,對象在不同層之間進行轉換映射,很不建議使用BeanUtil.copyProperties這種方式,更加推薦使用原生的set, get方式,不容易出錯。當然這不是將BeanUtil.copyProperties一棒子打死,毫無用武之地,在特定場景,比如方法內部對象的轉換等影響小的范圍還是很方便的。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4828

    瀏覽量

    69063
  • 編譯
    +關注

    關注

    0

    文章

    661

    瀏覽量

    33048

原文標題:麻了!不要再動不動就用BeanUtil.copyProperties了!!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Python高級特性:迭代器切片的應用

    是 Python 獨特的一種高級特性,而切片也是一種高級特性,兩者相結合,會產生什么樣的結果呢? 1、迭代與迭代器 首先,有幾個基本概念要
    發表于 11-29 10:11 ?693次閱讀

    對象轉換工具:MapStruct

    在我們日常開發的程序,為了各層之間解耦,一般會定義不同的對象用來在不同層之間傳遞數據,比如xxxDTO、xxxVO、xxxQO,當在不同層之間傳輸數據時,不可避免地經常需要將這些對象進行
    的頭像 發表于 10-08 14:39 ?1132次閱讀

    16位高級控制定時器STM816有哪些特性

    STM816位高級控制定時器的主要特性
    發表于 11-16 07:23

    高級處理器特性能否提高編碼效率?

    高級處理器特性能否提高編碼效率?
    發表于 04-26 06:41

    高級控制定時器有哪些特性

    高級控制定時器和通用定時器有何功能?高級控制定時器有哪些特性呢?
    發表于 11-10 06:51

    LabVIEW調用DLL的高級技巧后續資源包

    1、LabVIEW調用DLL的高級技巧2、.NET InteropAssembly Builder3、LabVIEW機器人版
    發表于 07-01 08:28 ?210次下載

    Trace32的高級功能特性

    Trace32的高級功能特性 Logic analyzer Real-time Streaming and Profiling Boundary Scan Third Party Tools Intergrations Virtual Targets Debugging
    發表于 11-16 12:52 ?28次下載
    Trace32的<b class='flag-5'>高級</b>功能<b class='flag-5'>特性</b>

    在設計如何使用高級PCB模塊

    添加高級 PCB 模塊可以使 PADS Standard Plus 的功能更加強大。此模塊物超所值,其中包含了高速自動布線、DFT 審核和高級封裝功能。在此視頻,我們將向您展示如何使用高級
    的頭像 發表于 05-14 06:21 ?2070次閱讀

    STMCube.AI的高級特性

    STM32CubeMX的功能。它還提供幾種在桌面PC和STM32上驗證神經網絡模型以及測量模型性能的方法,而無需用戶手工編寫專門的C語言代碼。 上一篇文章大致介紹了STMCube.AI的基本特性,以及其工作流程。 本文將更深入地介紹它的一些高級
    的頭像 發表于 10-28 10:05 ?2061次閱讀
    STMCube.AI的<b class='flag-5'>高級</b><b class='flag-5'>特性</b>

    STM32Cube.AI庫的高級特性

    STM32CubeMX的功能。它還提供幾種在桌面PC和STM32上驗證神經網絡模型以及測量模型性能的方法,而無需用戶手工編寫專門的C語言代碼。 上一篇文章大致介紹了STMCube.AI的基本特性,以及其工作流程。 本文將更深入地介紹它的一些高級
    的頭像 發表于 11-16 16:59 ?3200次閱讀
    STM32Cube.AI庫的<b class='flag-5'>高級</b><b class='flag-5'>特性</b>

    SOK將HugeCTR高級特性進行包裝使用

    ),來將 HugeCTR 高級特性封裝為 TensorFlow 可直接調用的形式,從而幫助用戶在 TensorFlow 中直接使用 HugeCTR
    的頭像 發表于 04-07 16:02 ?1317次閱讀
    SOK將HugeCTR<b class='flag-5'>中</b>的<b class='flag-5'>高級</b><b class='flag-5'>特性</b>進行包裝使用

    英特爾高級鏈路分析器全新混合行為模式,兼“雙優”特性

    英特爾 Quartus Prime 設計軟件的英特爾 高級鏈路分析器擁有全新特性。它除了支持英特爾 Stratix 10 TX 家族 E-Tile IBIS-AMI,提供封裝支持,還擁有全新的通道查看器功能。
    發表于 01-31 14:44 ?357次閱讀

    別再用BeanUtils了,這款PO VO DTO轉換神器不香么?

    關于lombok和mapstruct的版本兼容問題多說幾句,maven插件要使用3.6.0版本以上、lombok使用1.16.16版本以上,另外編譯的lombok mapstruct的插件不要忘了加上。
    的頭像 發表于 07-10 10:46 ?608次閱讀
    別再用BeanUtils了,這款PO VO DTO轉換神器不香么?

    如何在實際的代碼中使Spring組件的特性

    首先,我們將探討一些 Spring 框架 IOC(Inversion of Control)的高級特性,特別是組件掃描的相關知識。
    的頭像 發表于 08-11 09:52 ?650次閱讀
    如何在實際的代碼中使Spring組件的<b class='flag-5'>特性</b>?

    Wilink8高級特性

    電子發燒友網站提供《Wilink8高級特性.pdf》資料免費下載
    發表于 11-08 15:58 ?0次下載
    Wilink8<b class='flag-5'>高級</b><b class='flag-5'>特性</b>
    百家乐官网规则澳门| 专业百家乐官网分析| 百家乐官网视频游戏大厅| 百家乐官网博弈指| 百家乐庄闲局部失| 娱乐城彩金| 百家乐官网實戰後二穩賺| 百家乐投注网中国体育| 大发888游乐城| 大发888真钱游戏下载365| 百家乐官网看单技术| 百家乐官网骗局视频| 百家乐稳赢投注| 利记线上娱乐| 百家乐官网任你博娱乐| 百家乐的方法和公式| 德州扑克3d豪华版| 百家乐官网作弊视频| 百家乐官网娱乐网77scs| 百威百家乐的玩法技巧和规则| 516棋牌游戏下载| 独赢百家乐官网全讯网| 百家乐策略与心得| 棋牌类游戏| 香港百家乐官网赌场娱乐网规则| 百家乐平注法到| 新巴尔虎右旗| 网上的百家乐官网是真是假 | 百家乐官网庄闲偏差有多大| 百家百家乐官网网站| 百家乐官网最常见的路子| 百家乐八卦九| 百家乐官网开庄概率| 百家乐最大的赌局| 黑水县| 做生意门口怎么摆放| 88娱乐城开户| 做生意讲究风水| 奔驰娱乐城开户| 金字塔百家乐官网的玩法技巧和规则 | 大发888 王博|