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

MapStruct表達(dá)式應(yīng)用及避坑詳解

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

前言

生成的映射代碼使用簡(jiǎn)單的方法調(diào)用,因此速度快,類型安全且易于理解。MapStruct的表達(dá)式功能是為了處理特殊對(duì)象屬性的映射問(wèn)題,比如DTO中的status屬性轉(zhuǎn)換成PO中的status需要進(jìn)一步的處理,這個(gè)時(shí)候就需要用到表達(dá)式功能了。這里不再贅述關(guān)于MapStruct的使用問(wèn)題,更多的使用教程可參考文檔

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

遇到的問(wèn)題

先看一段映射的代碼:

@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)";
    }
}

原本這段代碼表達(dá)的語(yǔ)義是:將DepartmentBO的status屬性賦值給DepartmentsVO時(shí),需要進(jìn)行一些簡(jiǎn)單的轉(zhuǎn)換,轉(zhuǎn)換的方法就是Mapper接口里定義的toStatus靜態(tài)方法。可最終MapStruct生成的代碼把其他屬性的賦值動(dòng)作也做了處理。生成的代碼如下:

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

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

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

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

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

結(jié)語(yǔ)

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

以上就是MapStruct表達(dá)式應(yīng)用及避坑詳解的詳細(xì)內(nèi)容,更多關(guān)于MapStruct表達(dá)式避坑的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JVM性能調(diào)優(yōu)之運(yùn)行時(shí)參數(shù)小結(jié)

    JVM性能調(diào)優(yōu)之運(yùn)行時(shí)參數(shù)小結(jié)

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

    Spring?boot?RedisTemplate?序列化服務(wù)化配置方式

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

    Java中的hashcode方法介紹

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

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

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

    如何使用spring ResponseEntity處理http響應(yīng)

    這篇文章主要介紹了如何使用spring ResponseEntity處理http響應(yīng)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • python和java哪個(gè)學(xué)起來(lái)更簡(jiǎn)單

    python和java哪個(gè)學(xué)起來(lái)更簡(jiǎn)單

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

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

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

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

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

    MyBatis Plus 將查詢結(jié)果封裝到指定實(shí)體的方法步驟

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

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

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

最新評(píng)論

都兰县| 保定市| 江油市| 平南县| 鹤峰县| 平南县| 奎屯市| 抚宁县| 昌邑市| 石阡县| 惠东县| 香河县| 常宁市| 察隅县| 六枝特区| 汝城县| 内黄县| 滨州市| 郴州市| 台前县| 沈阳市| 辽宁省| 新和县| 宣武区| 都安| 屏南县| 巴东县| 元江| 平山县| 班玛县| 平湖市| 南和县| 繁昌县| 香河县| 桐乡市| 沙湾县| 阳原县| 龙江县| 嘉鱼县| 五家渠市| 清苑县|