MapStruct升級遇到的問題及解決方案
大家知道,MapStruct是一個用于生成類型安全,高性能和無依賴的bean映射代碼的注釋處理器。雖然它提高了一個一個字段進(jìn)行set賦值的開發(fā)效率,但是版本升級也可能有不兼容的問題。
問題:
1..升級mapstruct到1.3.0版本之后,當(dāng)target類使用lombok的@Builder注解,并且source類和target類的首字母不同的字段沒有被正確轉(zhuǎn)換(1.2.0版本可以正常轉(zhuǎn)換)。
2.升級mapstruct到1.3.0版本之后,當(dāng)target類使用lombok的@Builder注解,并且需要映射到父類的屬性,則編譯時會報 Unknown property
分析:
MapStruct 和lombok 的相遇,如果版本不一致,就會帶來一定的問題。
MapStruct是一個用于生成類型安全,高性能和無依賴的bean映射代碼的注釋處理器;
而LombokLombok是一款Java開發(fā)插件,使得Java開發(fā)者可以通過其定義的一些注解來消除業(yè)務(wù)工程中冗長和繁瑣的代碼,比如get set等,尤其對于簡單的Java模型對象(POJO)。
兩者都是通過注解處理器在編譯期生成對應(yīng)的代碼。
舉例如下:
下圖為基于Lombok注解的POJO類:

這個是基于MapStruct注解定義的mapper接口

經(jīng)過lombok的注解處理器,編譯后的class如下:

經(jīng)過mapstruct的注解處理器,對UserDTOMapper自動生成了接口實現(xiàn)類:

結(jié)論:
可見,mapstruct 的注解處理器必須晚于 lombok的注解處理器執(zhí)行,才能保證bean 屬性能被正確映射。而出現(xià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的處理過程的。
這里仍然有個細(xì)節(jié)大家可以關(guān)注下:
(1)在annotationProcessorPaths 中去掉lombok-mapstruct-binding 這個包,其實也可以正確執(zhí)行的。只要lombok的path 聲明在 mapstruct之前。
(2)上述的annotationProcessorPaths配置,如果顛倒了lombok和mapstruct的順序,其實也是可以正確執(zhí)行的,只要同時引入了lombok-mapstruct-binding
總結(jié)
1.在POM中沒有annotationProcessorPaths時,Maven使用的classPath作為注解處理器執(zhí)行的順序,而classPath的順序正是dependencies中匯入的順序。
2.當(dāng)MapStruct依賴在Lombok依賴前面時,在執(zhí)行注解處理器期間, 由于Lombok還未生成get、set程式碼,因此在MapStruct看來,這些類并沒有公開的成員變數(shù),也就無從生成用于轉(zhuǎn)換的方法。
3.在使用annotationProcessorPaths后,其強制規(guī)定了注解處理器的順序,dependencies中的順序就被忽略了,Maven一定會先執(zhí)行Lombok再執(zhí)行MapStruct。
到此這篇關(guān)于MapStruct升級遇到的問題及解決方案的文章就介紹到這了,更多相關(guān)MapStruct升級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中MapStruct的使用詳解
- Java中MapStruct使用方法解析
- Java中的MapStruct知識點總結(jié)
- Java中的MapStruct的使用方法代碼實例
- Java中的MapStruct實現(xiàn)詳解
- Java中MapStruct入門使用及對比
- Java高效映射工具M(jìn)apStruct的使用示例
- Java中MapStruct映射處理器報錯的問題解決
- Java高性能實體類轉(zhuǎn)換工具M(jìn)apStruct的使用教程詳解
- SpringBoot中MapStruct實現(xiàn)優(yōu)雅的數(shù)據(jù)復(fù)制
- SpringBoot使用MapStruct生成映射代碼的示例詳解
相關(guān)文章
spring boot切面execution表達(dá)式添加多個包路徑問題及解決方案
在Spring Boot中,如果你想為多個包中的方法創(chuàng)建一個切面,你可以在@Pointcut注解中使用||操作符來指定多個包,下面給大家分享spring boot切面execution表達(dá)式添加多個包路徑問題及解決方案,感興趣的朋友跟隨小編一起看看吧2024-03-03
Java使用POI導(dǎo)出大數(shù)據(jù)量Excel的方法
今天需要寫一個導(dǎo)出的Excel的功能,但是發(fā)現(xiàn)當(dāng)數(shù)據(jù)量到3萬條時,列數(shù)在23列時,內(nèi)存溢出,CPU使用100%,測試環(huán)境直接炸掉。小編給大家分享基于java使用POI導(dǎo)出大數(shù)據(jù)量Excel的方法,感興趣的朋友一起看看吧2019-11-11
SpringBoot 如何整合 ES 實現(xiàn) CRUD 操作
這篇文章主要介紹了SpringBoot 如何整合 ES 實現(xiàn) CRUD 操作,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-10-10
springboot項目中集成shiro+jwt完整實例代碼
本文詳細(xì)介紹如何在項目中集成Shiro和JWT,實現(xiàn)用戶登錄校驗、token攜帶及接口權(quán)限管理,涉及自定義Realm、ModularRealmAuthenticator和JwtFilter的配置,對springboot?集成shiro?jwt完整示例感興趣的朋友一起看看吧2025-08-08

