MapStruct表達(dá)式應(yīng)用及避坑詳解
前言
生成的映射代碼使用簡(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是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ù)化配置方式
這篇文章主要介紹了Springboot?RedisTemplate序列化服務(wù)化配置方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
如何使用spring ResponseEntity處理http響應(yīng)
這篇文章主要介紹了如何使用spring ResponseEntity處理http響應(yīng)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
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與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í)體的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
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

