mapstruct中的@Mapper注解的基本用法
在MapStruct中,@Mapper
注解是核心注解之一,用于標(biāo)記一個(gè)接口或抽象類為MapStruct的映射器(Mapper)。MapStruct會(huì)在編譯時(shí)自動(dòng)生成該接口的實(shí)現(xiàn)類,完成對(duì)象之間的屬性映射。以下是對(duì)@Mapper
注解的詳細(xì)解析:
1. 基本用法
@Mapper
注解可以單獨(dú)使用,也可以配合其他屬性進(jìn)行配置。以下是一個(gè)簡單的示例:
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); @Mapping(source = "username", target = "name") UserDTO toUserDTO(User user); }
@Mapper
:標(biāo)記接口為MapStruct的映射器。Mappers.getMapper(UserMapper.class)
:獲取MapStruct自動(dòng)生成的映射器實(shí)例。@Mapping
:指定屬性映射規(guī)則(例如將User
的username
屬性映射到UserDTO
的name
屬性)。
2. 常用屬性
@Mapper
注解支持多種屬性,用于配置映射器的行為:
(1) componentModel
指定生成的映射器實(shí)現(xiàn)類的組件模型,便于與其他框架(如Spring、CDI)集成。
可選值: default
:默認(rèn)模型,不依賴任何框架。
spring
:生成的映射器實(shí)現(xiàn)類會(huì)帶有@Component
注解,便于Spring管理。cdi
:生成的映射器實(shí)現(xiàn)類會(huì)帶有@ApplicationScoped
注解,便于CDI管理。jsr330
:生成的映射器實(shí)現(xiàn)類會(huì)帶有@javax.inject.Named
和@javax.inject.Singleton
注解。
示例:
@Mapper(componentModel = "spring") public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); // ... }
(2) uses
指定其他映射器或工具類,用于在映射過程中調(diào)用。
示例:
@Mapper(uses = {DateMapper.class}) public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); // ... }
(3) implementationName
和 implementationPackage
implementationName
:指定生成的映射器實(shí)現(xiàn)類的名稱(默認(rèn)為接口名+Impl
)。implementationPackage
:指定生成的映射器實(shí)現(xiàn)類的包名(默認(rèn)為接口所在包)。
示例:
@Mapper(implementationName = "CustomUserMapperImpl", implementationPackage = "com.example.mappers") public interface UserMapper { // ... }
(4) unmappedTargetPolicy
指定當(dāng)目標(biāo)對(duì)象有未映射的屬性時(shí)的處理策略。
可選值:
ERROR
:拋出異常(默認(rèn)值)。WARN
:生成警告日志。IGNORE
:忽略未映射的屬性。
示例:
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface UserMapper { // ... }
(5) injectionStrategy
指定依賴注入的策略。
可選值:
FIELD
:通過字段注入(默認(rèn)值)。CONSTRUCTOR
:通過構(gòu)造函數(shù)注入。METHOD
:通過方法注入。
示例:
@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR) public interface UserMapper { // ... }
3. 高級(jí)用法
(1) 結(jié)合@MapperConfig
可以通過@MapperConfig
定義全局配置,然后在@Mapper
中引用。
示例:
@MapperConfig(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public interface CommonMapperConfig { } @Mapper(config = CommonMapperConfig.class) public interface UserMapper { // ... }
(2) 自定義方法
可以在映射器接口中定義自定義方法,MapStruct會(huì)調(diào)用這些方法完成復(fù)雜的映射邏輯。
示例:
@Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); @Mapping(target = "fullName", expression = "java(user.getFirstName() + \" \" + user.getLastName())") UserDTO toUserDTO(User user); default String formatDate(Date date) { // 自定義日期格式化邏輯 return new SimpleDateFormat("yyyy-MM-dd").format(date); } }
4. 注意事項(xiàng)
依賴配置:
- 確保項(xiàng)目中包含MapStruct的依賴和注解處理器(
mapstruct
和mapstruct-processor
)。 - 如果使用Lombok,確保Lombok的版本兼容,并在構(gòu)建工具(如Maven或Gradle)中正確配置。
映射規(guī)則:
- 如果源對(duì)象和目標(biāo)對(duì)象的屬性名相同,MapStruct會(huì)自動(dòng)映射。
- 如果屬性名不同,需要通過
@Mapping
注解顯式指定。
性能:
- MapStruct生成的映射代碼是類型安全的,且在編譯時(shí)完成,性能優(yōu)于運(yùn)行時(shí)反射的映射工具(如Apache Commons BeanUtils)。
5. 總結(jié)
@Mapper
注解是MapStruct的核心,通過它可以:
- 定義映射器接口。
- 配置映射器的行為(如組件模型、未映射屬性的處理策略等)。
- 結(jié)合其他注解(如
@Mapping
)完成復(fù)雜的屬性映射。 - 與其他框架(如Spring)無縫集成。
通過合理使用@Mapper
注解及其屬性,可以大大簡化對(duì)象之間的映射邏輯,提高開發(fā)效率和代碼質(zhì)量。
6. 編譯異常處理
針對(duì)MapStruct項(xiàng)目編譯異常問題,可從依賴配置、IDE設(shè)置、代碼規(guī)范及版本兼容性四個(gè)維度進(jìn)行排查和解決,以下是具體分析和建議:
- 現(xiàn)象:缺少必要的注解處理器依賴,如
org.mapstruct:mapstruct-processor
,導(dǎo)致編譯時(shí)無法生成Mapper類。 - 解決方案:
- Maven項(xiàng)目:在
pom.xml
中添加MapStruct核心庫和處理器依賴,例如:
- Maven項(xiàng)目:在
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.5.3.Final</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.5.3.Final</version> <scope>provided</scope> </dependency>
- **Gradle項(xiàng)目**:在`build.gradle`中添加:
implementation 'org.mapstruct:mapstruct:1.5.3.Final' annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'
IDE設(shè)置問題
- 現(xiàn)象:IDE未啟用注解處理器或緩存異常,導(dǎo)致編譯時(shí)無法正確處理MapStruct注解。
- 解決方案:
- IntelliJ IDEA:打開“File”菜單,選擇“Settings”,導(dǎo)航至“Build, Execution, Deployment” -> “Compiler” -> “Annotation Processors”,勾選“Enable annotation processing”選項(xiàng),并清理IDE緩存后重新構(gòu)建項(xiàng)目。
代碼規(guī)范問題
- 現(xiàn)象:Mapper接口定義錯(cuò)誤,如方法簽名不匹配或缺少必要注解,導(dǎo)致編譯失敗。
- 解決方案:
- 驗(yàn)證Mapper接口:確保接口符合MapStruct規(guī)范,例如:
@Mapper public interface UserMapper { UserDto userToUserDto(User user); }
- **檢查屬性映射**:如果源對(duì)象和目標(biāo)對(duì)象的屬性名不同,需要通過`@Mapping`注解顯式指定,例如:
@Mapper public interface UserMapper { @Mapping(source = "username", target = "name") UserDto userToUserDto(User user); }
版本兼容性問題
- 現(xiàn)象:MapStruct版本與其他依賴(如Lombok)不兼容,導(dǎo)致編譯異常。
- 解決方案:
- 升級(jí)MapStruct版本:嘗試升級(jí)至最新穩(wěn)定版本,例如:
<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.6.0.Final</version> </dependency>
- **解決Lombok沖突**:如果項(xiàng)目中同時(shí)使用Lombok和MapStruct,特別是使用Lombok的`@Builder`注解時(shí),可能導(dǎo)致`@AfterMapping`不生效。對(duì)于Lombok版本1.18.16或更高版本,需添加`lombok-mapstruct-binding`依賴:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </dependency>
其他可能的問題及解決方案
- 未映射的目標(biāo)屬性:檢查源對(duì)象和目標(biāo)對(duì)象,確保存在對(duì)應(yīng)的屬性,或使用
@Mapping(target = "property", ignore = true)
忽略不需要映射的屬性。 - 枚舉類型映射:自定義映射方法,例如:
@Mapper public interface EnumConverter { default TargetEnum toTargetEnum(SourceEnum sourceEnum) { if (sourceEnum == null) { return null; } switch (sourceEnum) { case SOURCE_VALUE1: return TargetEnum.TARGET_VALUE1; case SOURCE_VALUE2: return TargetEnum.TARGET_VALUE2; default: throw new IllegalArgumentException("Unknown enum type: " + sourceEnum); } } }
- 集合類型映射:使用
@IterableMapping
注解明確指定集合類型的映射方式。 - 循環(huán)引用問題:使用
@Context
注解通過傳遞上下文對(duì)象來避免無限遞歸。
到此這篇關(guān)于mapstruct中的@Mapper注解的基本用法的文章就介紹到這了,更多相關(guān)mapstruct @Mapper注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中@RequestMapping、@PostMapping、@GetMapping的實(shí)現(xiàn)
RequestMapping、@PostMapping和@GetMapping是三個(gè)非常常用的注解,本文就來介紹一下這三種注解的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerCont
這篇文章主要介紹了springboot整合websocket后啟動(dòng)報(bào)錯(cuò)(javax.websocket.server.ServerContainer not available),通過分析錯(cuò)誤信息、排查代碼和配置,找出問題的根源,并給出相應(yīng)的解決方案,感興趣的可以了解一下2024-01-01解決新版idea新建文件沒有XML和Resource Bundle文件問題
這篇文章主要介紹了解決新版idea新建文件沒有XML和Resource Bundle文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07java多線程開發(fā)ScheduledExecutorService簡化方式
這篇文章主要為大家介紹了java多線程開發(fā)ScheduledExecutorService的簡化方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03JAVA+MySQL實(shí)現(xiàn)分庫分表的項(xiàng)目實(shí)踐
本文主要介紹了JAVA+MySQL實(shí)現(xiàn)分庫分表的項(xiàng)目實(shí)踐,包括水平分表、垂直分表和水平分庫等策略,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05Spring MVC中使用Google kaptcha驗(yàn)證碼的方法詳解
kaptcha 是一個(gè)非常實(shí)用的驗(yàn)證碼生成工具。有了它,你可以生成各種樣式的驗(yàn)證碼,因?yàn)樗强膳渲玫?,下面這篇文章主要給大家介紹了關(guān)于Spring MVC中使用Google kaptcha驗(yàn)證碼的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10JAVA數(shù)據(jù)結(jié)構(gòu)之漢諾塔代碼實(shí)例
這篇文章主要介紹了JAVA數(shù)據(jù)結(jié)構(gòu)之漢諾塔,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04OPENCV+JAVA實(shí)現(xiàn)人臉識(shí)別
這篇文章主要為大家詳細(xì)介紹了OPENCV+JAVA實(shí)現(xiàn)人臉識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02