欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mapstruct中的@Mapper注解的基本用法

 更新時(shí)間:2025年06月13日 11:53:37   作者:有夢(mèng)想的攻城獅  
在MapStruct中,@Mapper注解是核心注解之一,用于標(biāo)記一個(gè)接口或抽象類(lèi)為MapStruct的映射器(Mapper),本文給大家介紹mapstruct中的@Mapper注解的相關(guān)知識(shí),感興趣的朋友一起看看吧

在MapStruct中,@Mapper注解是核心注解之一,用于標(biāo)記一個(gè)接口或抽象類(lèi)為MapStruct的映射器(Mapper)。MapStruct會(huì)在編譯時(shí)自動(dòng)生成該接口的實(shí)現(xiàn)類(lèi),完成對(duì)象之間的屬性映射。以下是對(duì)@Mapper注解的詳細(xì)解析:

1. 基本用法

@Mapper注解可以單獨(dú)使用,也可以配合其他屬性進(jìn)行配置。以下是一個(gè)簡(jiǎn)單的示例:

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ī)則(例如將Userusername屬性映射到UserDTOname屬性)。

2. 常用屬性

@Mapper注解支持多種屬性,用于配置映射器的行為:

(1) componentModel

指定生成的映射器實(shí)現(xiàn)類(lèi)的組件模型,便于與其他框架(如Spring、CDI)集成。

可選值default:默認(rèn)模型,不依賴任何框架。

  • spring:生成的映射器實(shí)現(xiàn)類(lèi)會(huì)帶有@Component注解,便于Spring管理。
  • cdi:生成的映射器實(shí)現(xiàn)類(lèi)會(huì)帶有@ApplicationScoped注解,便于CDI管理。
  • jsr330:生成的映射器實(shí)現(xiàn)類(lèi)會(huì)帶有@javax.inject.Named@javax.inject.Singleton注解。

示例

@Mapper(componentModel = "spring")
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    // ...
}

(2) uses

指定其他映射器或工具類(lèi),用于在映射過(guò)程中調(diào)用。

示例

@Mapper(uses = {DateMapper.class})
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    // ...
}

(3) implementationNameimplementationPackage

  • implementationName:指定生成的映射器實(shí)現(xiàn)類(lèi)的名稱(默認(rèn)為接口名+Impl)。
  • implementationPackage:指定生成的映射器實(shí)現(xiàn)類(lèi)的包名(默認(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:通過(guò)字段注入(默認(rèn)值)。
  • CONSTRUCTOR:通過(guò)構(gòu)造函數(shù)注入。
  • METHOD:通過(guò)方法注入。

示例

@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface UserMapper {
    // ...
}

3. 高級(jí)用法

(1) 結(jié)合@MapperConfig

可以通過(guò)@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的依賴和注解處理器(mapstructmapstruct-processor)。
  • 如果使用Lombok,確保Lombok的版本兼容,并在構(gòu)建工具(如Maven或Gradle)中正確配置。

映射規(guī)則

  • 如果源對(duì)象和目標(biāo)對(duì)象的屬性名相同,MapStruct會(huì)自動(dòng)映射。
  • 如果屬性名不同,需要通過(guò)@Mapping注解顯式指定。

性能

  • MapStruct生成的映射代碼是類(lèi)型安全的,且在編譯時(shí)完成,性能優(yōu)于運(yùn)行時(shí)反射的映射工具(如Apache Commons BeanUtils)。

5. 總結(jié)

@Mapper注解是MapStruct的核心,通過(guò)它可以:

  • 定義映射器接口。
  • 配置映射器的行為(如組件模型、未映射屬性的處理策略等)。
  • 結(jié)合其他注解(如@Mapping)完成復(fù)雜的屬性映射。
  • 與其他框架(如Spring)無(wú)縫集成。

通過(guò)合理使用@Mapper注解及其屬性,可以大大簡(jiǎn)化對(duì)象之間的映射邏輯,提高開(kāi)發(fā)效率和代碼質(zhì)量。

6. 編譯異常處理

針對(duì)MapStruct項(xiàng)目編譯異常問(wèn)題,可從依賴配置、IDE設(shè)置、代碼規(guī)范及版本兼容性四個(gè)維度進(jìn)行排查和解決,以下是具體分析和建議:

  • 現(xiàn)象:缺少必要的注解處理器依賴,如org.mapstruct:mapstruct-processor,導(dǎo)致編譯時(shí)無(wú)法生成Mapper類(lèi)。
  • 解決方案
    • Maven項(xiàng)目:在pom.xml中添加MapStruct核心庫(kù)和處理器依賴,例如:
<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è)置問(wèn)題

  • 現(xiàn)象:IDE未啟用注解處理器或緩存異常,導(dǎo)致編譯時(shí)無(wú)法正確處理MapStruct注解。
  • 解決方案
    • IntelliJ IDEA:打開(kāi)“File”菜單,選擇“Settings”,導(dǎo)航至“Build, Execution, Deployment” -> “Compiler” -> “Annotation Processors”,勾選“Enable annotation processing”選項(xiàng),并清理IDE緩存后重新構(gòu)建項(xiàng)目。

代碼規(guī)范問(wèn)題

  • 現(xiàn)象:Mapper接口定義錯(cuò)誤,如方法簽名不匹配或缺少必要注解,導(dǎo)致編譯失敗。
  • 解決方案
    • 驗(yàn)證Mapper接口:確保接口符合MapStruct規(guī)范,例如:
@Mapper
public interface UserMapper {
    UserDto userToUserDto(User user);
}
- **檢查屬性映射**:如果源對(duì)象和目標(biāo)對(duì)象的屬性名不同,需要通過(guò)`@Mapping`注解顯式指定,例如:
@Mapper
public interface UserMapper {
    @Mapping(source = "username", target = "name")
    UserDto userToUserDto(User user);
}

版本兼容性問(wèn)題

  • 現(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>

其他可能的問(wèn)題及解決方案

  • 未映射的目標(biāo)屬性:檢查源對(duì)象和目標(biāo)對(duì)象,確保存在對(duì)應(yīng)的屬性,或使用@Mapping(target = "property", ignore = true)忽略不需要映射的屬性。
  • 枚舉類(lèi)型映射:自定義映射方法,例如:
@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);
        }
    }
}
  • 集合類(lèi)型映射:使用@IterableMapping注解明確指定集合類(lèi)型的映射方式。
  • 循環(huán)引用問(wèn)題:使用@Context注解通過(guò)傳遞上下文對(duì)象來(lái)避免無(wú)限遞歸。

到此這篇關(guān)于mapstruct中的@Mapper注解的基本用法的文章就介紹到這了,更多相關(guān)mapstruct @Mapper注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java使用5個(gè)線程計(jì)算數(shù)組之和

    Java使用5個(gè)線程計(jì)算數(shù)組之和

    本文主要介紹了Java使用5個(gè)線程計(jì)算數(shù)組之和,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Spring?Bean的作用域具體實(shí)現(xiàn)(單例、多例、請(qǐng)求、會(huì)話、Application)

    Spring?Bean的作用域具體實(shí)現(xiàn)(單例、多例、請(qǐng)求、會(huì)話、Application)

    文章講解了Spring?IoC/?DI中Bean作用域的管理方式,涵蓋單例(singleton)、原型(prototype)及Web環(huán)境的request、session、application作用域,通過(guò)注解和配置區(qū)分不同作用域的實(shí)例創(chuàng)建規(guī)則,并通過(guò)測(cè)試驗(yàn)證其生命周期與共享特性,感興趣的朋友一起看看吧
    2025-08-08
  • Mybatis的sql語(yǔ)句執(zhí)行異常后打印到日志問(wèn)題

    Mybatis的sql語(yǔ)句執(zhí)行異常后打印到日志問(wèn)題

    文章介紹了一種Mybatis異常日志打印方案,主要通過(guò)Mybatis攔截器獲取執(zhí)行的sql語(yǔ)句,并利用ThreadLocal存儲(chǔ),以避免多線程下的sql語(yǔ)句覆蓋問(wèn)題,當(dāng)異常發(fā)生時(shí),從ThreadLocal中取出sql語(yǔ)句并打印到單獨(dú)的日志文件中,方便數(shù)據(jù)恢復(fù),該方案經(jīng)過(guò)壓力測(cè)試
    2024-10-10
  • Springboot整合GuavaCache緩存過(guò)程解析

    Springboot整合GuavaCache緩存過(guò)程解析

    這篇文章主要介紹了springboot整合GuavaCache緩存過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 如何將DeepSeek 集成到 Java 的 Spring Boot 項(xiàng)目中

    如何將DeepSeek 集成到 Java 的 Spring Boot&

    本文介紹了如何將DeepSeek集成到Java的SpringBoot項(xiàng)目中,包括準(zhǔn)備工作、集成步驟和示例說(shuō)明,感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot整合Canal與RabbitMQ監(jiān)聽(tīng)數(shù)據(jù)變更記錄

    SpringBoot整合Canal與RabbitMQ監(jiān)聽(tīng)數(shù)據(jù)變更記錄

    這篇文章主要介紹了SpringBoot整合Canal與RabbitMQ監(jiān)聽(tīng)數(shù)據(jù)變更記錄,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • Java?this關(guān)鍵字的使用案例詳解

    Java?this關(guān)鍵字的使用案例詳解

    這篇文章主要為大家介紹了Java?this關(guān)鍵字的使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • MyBatisPlus查詢投影與查詢條件詳細(xì)講解

    MyBatisPlus查詢投影與查詢條件詳細(xì)講解

    這篇文章主要介紹了MyBatisPlus DQL編程控制中的查詢投影、查詢條件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Java API如何實(shí)現(xiàn)向Hive批量導(dǎo)入數(shù)據(jù)

    Java API如何實(shí)現(xiàn)向Hive批量導(dǎo)入數(shù)據(jù)

    這篇文章主要介紹了Java API如何實(shí)現(xiàn)向Hive批量導(dǎo)入數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot自動(dòng)裝配原理小結(jié)

    SpringBoot自動(dòng)裝配原理小結(jié)

    Spring Boot主要作用就是簡(jiǎn)化Spring應(yīng)用的開(kāi)發(fā),開(kāi)發(fā)者只需要通過(guò)少量代碼就可以創(chuàng)建一個(gè)Spring應(yīng)用,而達(dá)到這一目的最核心的思想就是約定優(yōu)于配置。
    2021-05-05

最新評(píng)論