MapStruct升級(jí)遇到的問(wèn)題及解決方案
大家知道,MapStruct是一個(gè)用于生成類(lèi)型安全,高性能和無(wú)依賴(lài)的bean映射代碼的注釋處理器。雖然它提高了一個(gè)一個(gè)字段進(jìn)行set賦值的開(kāi)發(fā)效率,但是版本升級(jí)也可能有不兼容的問(wèn)題。
問(wèn)題:
1..升級(jí)mapstruct到1.3.0版本之后,當(dāng)target類(lèi)使用lombok的@Builder注解,并且source類(lèi)和target類(lèi)的首字母不同的字段沒(méi)有被正確轉(zhuǎn)換(1.2.0版本可以正常轉(zhuǎn)換)。
2.升級(jí)mapstruct到1.3.0版本之后,當(dāng)target類(lèi)使用lombok的@Builder注解,并且需要映射到父類(lèi)的屬性,則編譯時(shí)會(huì)報(bào) Unknown property
分析:
MapStruct 和lombok 的相遇,如果版本不一致,就會(huì)帶來(lái)一定的問(wèn)題。
MapStruct是一個(gè)用于生成類(lèi)型安全,高性能和無(wú)依賴(lài)的bean映射代碼的注釋處理器;
而LombokLombok是一款Java開(kāi)發(fā)插件,使得Java開(kāi)發(fā)者可以通過(guò)其定義的一些注解來(lái)消除業(yè)務(wù)工程中冗長(zhǎng)和繁瑣的代碼,比如get set等,尤其對(duì)于簡(jiǎn)單的Java模型對(duì)象(POJO)。
兩者都是通過(guò)注解處理器在編譯期生成對(duì)應(yīng)的代碼。
舉例如下:
下圖為基于Lombok注解的POJO類(lèi):
這個(gè)是基于MapStruct注解定義的mapper接口
經(jīng)過(guò)lombok的注解處理器,編譯后的class如下:
經(jīng)過(guò)mapstruct的注解處理器,對(duì)UserDTOMapper自動(dòng)生成了接口實(shí)現(xiàn)類(lèi):
結(jié)論:
可見(jiàn),mapstruct 的注解處理器必須晚于 lombok的注解處理器執(zhí)行,才能保證bean 屬性能被正確映射。而出現(xiàn)上述問(wèn)題的原因就在于lombok 和 mapstruct的執(zhí)行順序被打亂了。
解決方案:
在編譯插件中控制注解處理器的順序。
pom 如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <!-- <release>${java.version}</release>--> <annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok-plugin.version}</version> </path> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${mapstruct-plugin.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>${lombok-mapstruct-binding-plugin.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin>
其中 lombok-mapstruct-binding 的包正是為了協(xié)調(diào)lombok和mapstruct的處理過(guò)程的。
這里仍然有個(gè)細(xì)節(jié)大家可以關(guān)注下:
(1)在annotationProcessorPaths 中去掉lombok-mapstruct-binding 這個(gè)包,其實(shí)也可以正確執(zhí)行的。只要lombok的path 聲明在 mapstruct之前。
(2)上述的annotationProcessorPaths配置,如果顛倒了lombok和mapstruct的順序,其實(shí)也是可以正確執(zhí)行的,只要同時(shí)引入了lombok-mapstruct-binding
總結(jié)
1.在POM中沒(méi)有annotationProcessorPaths時(shí),Maven使用的classPath作為注解處理器執(zhí)行的順序,而classPath的順序正是dependencies中匯入的順序。
2.當(dāng)MapStruct依賴(lài)在Lombok依賴(lài)前面時(shí),在執(zhí)行注解處理器期間, 由于Lombok還未生成get、set程式碼,因此在MapStruct看來(lái),這些類(lèi)并沒(méi)有公開(kāi)的成員變數(shù),也就無(wú)從生成用于轉(zhuǎn)換的方法。
3.在使用annotationProcessorPaths后,其強(qiáng)制規(guī)定了注解處理器的順序,dependencies中的順序就被忽略了,Maven一定會(huì)先執(zhí)行Lombok再執(zhí)行MapStruct。
到此這篇關(guān)于MapStruct升級(jí)遇到的問(wèn)題及解決方案的文章就介紹到這了,更多相關(guān)MapStruct升級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中MapStruct的使用詳解
- Java中MapStruct使用方法解析
- Java中的MapStruct知識(shí)點(diǎn)總結(jié)
- Java中的MapStruct的使用方法代碼實(shí)例
- Java中的MapStruct實(shí)現(xiàn)詳解
- Java中MapStruct入門(mén)使用及對(duì)比
- Java高效映射工具M(jìn)apStruct的使用示例
- Java中MapStruct映射處理器報(bào)錯(cuò)的問(wèn)題解決
- Java高性能實(shí)體類(lèi)轉(zhuǎn)換工具M(jìn)apStruct的使用教程詳解
- SpringBoot中MapStruct實(shí)現(xiàn)優(yōu)雅的數(shù)據(jù)復(fù)制
- SpringBoot使用MapStruct生成映射代碼的示例詳解
相關(guān)文章
Java圖形界面開(kāi)發(fā)之簡(jiǎn)易記事本
這篇文章主要為大家詳細(xì)介紹了Java圖形界面開(kāi)發(fā)之簡(jiǎn)易記事本的制作方法,,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10springboot AutoConfigureAfter控制Bean的注入順序方法詳解
這個(gè)文章主要介紹一下@AutoConfigureAfter在spring框架中的作用,在使用過(guò)程中,很多開(kāi)發(fā)人員在使用它的時(shí)候都出現(xiàn)了問(wèn)題,問(wèn)題比較多的就是它們的注冊(cè)順序總不是我們預(yù)期的,下面介紹一下正常的使用方法,感興趣的朋友一起看看吧2024-05-05Java實(shí)現(xiàn)隨機(jī)出題,10道10以?xún)?nèi)加減法計(jì)算代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)隨機(jī)出題,10道10以?xún)?nèi)加減法計(jì)算,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04java求最大公約數(shù)與最小公倍數(shù)的方法示例
這篇文章主要介紹了java求最大公約數(shù)與最小公倍數(shù)的方法,涉及java數(shù)值運(yùn)算的相關(guān)操作技巧,并附帶分析了eclipse環(huán)境下設(shè)置運(yùn)行輸入?yún)?shù)的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11SSM框架把日志信息保存到數(shù)據(jù)庫(kù)過(guò)程詳解
這篇文章主要介紹了SSM框架把日志信息保存到數(shù)據(jù)庫(kù)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07