亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

生成的映射代碼使用簡單的方法調(diào)用,因此速度快,類型安全且易于理解。MapStruct的表達(dá)式功能是為了處理特殊對象屬性的映射問題,比如DTO中的status屬性轉(zhuǎn)換成PO中的status需要進(jìn)一步的處理,這個(gè)時(shí)候就需要用到表達(dá)式功能了。這里不再贅述關(guān)于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)";
    }
}

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

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

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

樓主反復(fù)查看官方文檔,最后就差把源碼拉下來看實(shí)現(xiàn)邏輯了,最后一個(gè)閃念猜想到了可能的原因。上面關(guān)于表達(dá)式的使用代碼沒有問題,官方文檔也寫的很清楚。主要是因?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é)語

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

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

相關(guān)文章

  • java中request對象各種方法的使用實(shí)例分析

    java中request對象各種方法的使用實(shí)例分析

    這篇文章主要介紹了java中request對象各種方法的使用,結(jié)合完整實(shí)例形式較為詳細(xì)的分析了request對象的功能及其常用方法的使用技巧,需要的朋友可以參考下
    2015-12-12
  • java虛擬機(jī)深入學(xué)習(xí)之內(nèi)存管理機(jī)制

    java虛擬機(jī)深入學(xué)習(xí)之內(nèi)存管理機(jī)制

    java虛擬機(jī)在程序運(yùn)行時(shí)將內(nèi)存劃分為多個(gè)區(qū)域,每個(gè)區(qū)域作用,生命周期各不相同,下面這篇文章主要給大家介紹了關(guān)于java虛擬機(jī)深入學(xué)習(xí)之內(nèi)存管理機(jī)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-11-11
  • java實(shí)現(xiàn)超市商品庫存管理平臺(tái)

    java實(shí)現(xiàn)超市商品庫存管理平臺(tái)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)超市商品庫存管理平臺(tái),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • SpringBoot和Vue.js實(shí)現(xiàn)的前后端分離的用戶權(quán)限管理系統(tǒng)

    SpringBoot和Vue.js實(shí)現(xiàn)的前后端分離的用戶權(quán)限管理系統(tǒng)

    本文主要介紹了SpringBoot和Vue.js實(shí)現(xiàn)的前后端分離的用戶權(quán)限管理系統(tǒng),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 關(guān)于spring?data?jpa?模糊查詢like的坑點(diǎn)

    關(guān)于spring?data?jpa?模糊查詢like的坑點(diǎn)

    這篇文章主要介紹了關(guān)于spring?data?jpa?模糊查詢like的坑點(diǎn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 探究Java中Integer緩沖區(qū)底層原理

    探究Java中Integer緩沖區(qū)底層原理

    本文將會(huì)給大家講一講Integer這個(gè)包裝類的底層原理。在現(xiàn)在的就業(yè)環(huán)境下,我們需要知其然,還要知其所以然,才能更好地滿足就業(yè)需求,感興趣的小伙伴可以參考閱讀
    2023-05-05
  • java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)完整案例

    java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)完整案例

    遞歸算法的代碼比較簡潔,可讀性較好;但是在實(shí)際的業(yè)務(wù)處理中會(huì)出現(xiàn)多次的重復(fù)調(diào)用,如果處理不好,很容易出現(xiàn)StackOverflowError報(bào)錯(cuò),這篇文章主要給大家介紹了關(guān)于java遞歸實(shí)現(xiàn)樹形結(jié)構(gòu)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能的示例代碼

    Java實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)網(wǎng)絡(luò)資源的斷點(diǎn)續(xù)傳功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2022-10-10
  • Java基礎(chǔ)之Math和Random類知識(shí)總結(jié)

    Java基礎(chǔ)之Math和Random類知識(shí)總結(jié)

    今天帶大家來學(xué)習(xí)java的Math和Random類,文中有非常詳細(xì)的代碼示例及介紹,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • Java后端Tomcat實(shí)現(xiàn)WebSocket實(shí)例教程

    Java后端Tomcat實(shí)現(xiàn)WebSocket實(shí)例教程

    WebSocket protocol 是HTML5一種新的協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信(full-duplex)。一開始的握手需要借助HTTP請求完成握手。本文給大家介紹Java后端Tomcat實(shí)現(xiàn)WebSocket實(shí)例教程,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05

最新評(píng)論