最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MapStruct表達式應用及避坑詳解

 更新時間:2022年02月22日 16:57:24   作者:kl  
一不小心踩了MapStruct表達式的坑,發(fā)現(xiàn)了一個在官方文檔上都找不到的功能,有必要記錄下。MapStruct是一個代碼生成器,它基于約定優(yōu)于配置的方法大大簡化了Java?Bean類型之間的映射的實現(xiàn)

前言

生成的映射代碼使用簡單的方法調用,因此速度快,類型安全且易于理解。MapStruct的表達式功能是為了處理特殊對象屬性的映射問題,比如DTO中的status屬性轉換成PO中的status需要進一步的處理,這個時候就需要用到表達式功能了。這里不再贅述關于MapStruct的使用問題,更多的使用教程可參考文檔

MapStruct官方文檔:https://mapstruct.org/documentation/stable/reference/html/#mapping-composition

遇到的問題

先看一段映射的代碼:

@Mapper(imports = CustomProcessors.class)
public interface DepartmentsMapper {
    @Mapping(target = "status", expression = "java( DepartmentsMapper.toStatus(department.getStatus()) )")
    DepartmentsVO boToVo(DepartmentBO department);
    static String toStatus(String status){
        return status + "狀態(tài)";
    }
}

原本這段代碼表達的語義是:將DepartmentBO的status屬性賦值給DepartmentsVO時,需要進行一些簡單的轉換,轉換的方法就是Mapper接口里定義的toStatus靜態(tài)方法??勺罱KMapStruct生成的代碼把其他屬性的賦值動作也做了處理。生成的代碼如下:

可以看到除了指定的status屬性加上了表達式中的代碼,其他的屬性也都加上了,這不是我們想要的效果。

發(fā)現(xiàn)原因

樓主反復查看官方文檔,最后就差把源碼拉下來看實現(xiàn)邏輯了,最后一個閃念猜想到了可能的原因。上面關于表達式的使用代碼沒有問題,官方文檔也寫的很清楚。主要是因為這里觸發(fā)了MapStruct的一個隱藏功能:仔細觀察生成的代碼發(fā)現(xiàn),只有Integer屬性的字段加上表達式中的代碼了,樓主推斷只要在定義maping的接口中定義了轉換方法就會被自動應用到相同類型屬性的轉換上。后面驗證確實如此,比如我去掉表達式的定義:

@Mapper(imports = CustomProcessors.class)
public interface DepartmentsMapper {
    DepartmentsVO boToVo(DepartmentBO department);
    static Integer toStatus(Integer status){
        return status + 1;
    }
}

最終生成的代碼還是所有的Integer屬性的值都加上了toStatus的處理了

結語

最后發(fā)現(xiàn)的這個特性竟然在官方文檔上找不到絲毫的描述,其實可以算一個非常不錯的功能,可以統(tǒng)一處理相同類型的屬性,比如屬性是一個對象時,只是在博主的這個場景下使用不到。最后的解決方案是將表達式中的代碼定義從Mapper接口中移出去就好了。

以上就是MapStruct表達式應用及避坑詳解的詳細內容,更多關于MapStruct表達式避坑的資料請關注腳本之家其它相關文章!

相關文章

  • JVM性能調優(yōu)之運行時參數(shù)小結

    JVM性能調優(yōu)之運行時參數(shù)小結

    jvm是java的運行環(huán)境,在jvm中有很多的參數(shù)可以進行設置,本文主要介紹了JVM性能調優(yōu)之運行時參數(shù)小結,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Spring?boot?RedisTemplate?序列化服務化配置方式

    Spring?boot?RedisTemplate?序列化服務化配置方式

    這篇文章主要介紹了Springboot?RedisTemplate序列化服務化配置方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Java中的hashcode方法介紹

    Java中的hashcode方法介紹

    這篇文章主要介紹了Java中的hashcode方法介紹,還是比較不錯的,這里分享給大家,供需要的朋友參考。
    2017-11-11
  • 詳解java重載與覆寫的區(qū)別

    詳解java重載與覆寫的區(qū)別

    很多同學會重載和重寫分不清楚,這篇文章主要介紹了詳解java重載與覆寫的區(qū)別,有需要的朋友可以了解一下。
    2016-11-11
  • 如何使用spring ResponseEntity處理http響應

    如何使用spring ResponseEntity處理http響應

    這篇文章主要介紹了如何使用spring ResponseEntity處理http響應的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • python和java哪個學起來更簡單

    python和java哪個學起來更簡單

    在本篇內容里小編給大家分享的是一篇關于python和java哪個學起來更簡單的相關內容,有興趣的朋友們參考下。
    2020-06-06
  • SpringBoot實現(xiàn)熱部署詳解

    SpringBoot實現(xiàn)熱部署詳解

    SpringBoot熱部署是一種開發(fā)時極為有用的功能,它能夠讓開發(fā)人員在代碼修改后無需手動重啟應用程序就能立即看到變化的效果,所以我本文就給打擊介紹一下為什么要使用熱部署以及實現(xiàn)熱部署的方式,需要的朋友可以參考下
    2023-07-07
  • Springboot與vue實例講解實現(xiàn)前后端分離的人事管理系統(tǒng)

    Springboot與vue實例講解實現(xiàn)前后端分離的人事管理系統(tǒng)

    這篇文章主要介紹了如何用Java實現(xiàn)企業(yè)人事管理系統(tǒng),文中采用springboot+vue實現(xiàn)前后端分離,感興趣的小伙伴可以學習一下
    2022-06-06
  • MyBatis Plus 將查詢結果封裝到指定實體的方法步驟

    MyBatis Plus 將查詢結果封裝到指定實體的方法步驟

    這篇文章主要介紹了MyBatis Plus 將查詢結果封裝到指定實體的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • SpringBoot集成Milvus和deeplearning4j實現(xiàn)圖搜圖功能

    SpringBoot集成Milvus和deeplearning4j實現(xiàn)圖搜圖功能

    Milvus?是一種高性能、高擴展性的向量數(shù)據(jù)庫,可在從筆記本電腦到大型分布式系統(tǒng)等各種環(huán)境中高效運行,Deeplearning4j(DL4J)是一個開源的深度學習框架,專門為Java和Scala開發(fā),本文給大家介紹了SpringBoot集成Milvus和deeplearning4j實現(xiàn)圖搜圖功能
    2024-10-10

最新評論

大兴区| 岐山县| 洪洞县| 漠河县| 永德县| 柘城县| 健康| 新疆| 汾阳市| 龙里县| 黑龙江省| 察隅县| 大荔县| 哈尔滨市| 茶陵县| 台前县| 探索| 石景山区| 嘉义市| 平谷区| 绥滨县| 鹤峰县| 金堂县| 财经| 阳西县| 垣曲县| 雷波县| 通山县| 陇西县| 丹棱县| 库伦旗| 垦利县| 开远市| 前郭尔| 昭通市| 当雄县| 娄烦县| 长武县| 叙永县| 克山县| 彭泽县|