最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

在MapStruct中,@Mapper注解是核心注解之一,用于標記一個接口或抽象類為MapStruct的映射器(Mapper)。MapStruct會在編譯時自動生成該接口的實現(xiàn)類,完成對象之間的屬性映射。以下是對@Mapper注解的詳細解析:

1. 基本用法

@Mapper注解可以單獨使用,也可以配合其他屬性進行配置。以下是一個簡單的示例:

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:標記接口為MapStruct的映射器。
  • Mappers.getMapper(UserMapper.class):獲取MapStruct自動生成的映射器實例。
  • @Mapping:指定屬性映射規(guī)則(例如將Userusername屬性映射到UserDTOname屬性)。

2. 常用屬性

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

(1) componentModel

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

可選值default:默認模型,不依賴任何框架。

  • spring:生成的映射器實現(xiàn)類會帶有@Component注解,便于Spring管理。
  • cdi:生成的映射器實現(xiàn)類會帶有@ApplicationScoped注解,便于CDI管理。
  • jsr330:生成的映射器實現(xiàn)類會帶有@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) implementationNameimplementationPackage

  • implementationName:指定生成的映射器實現(xiàn)類的名稱(默認為接口名+Impl)。
  • implementationPackage:指定生成的映射器實現(xiàn)類的包名(默認為接口所在包)。

示例

@Mapper(implementationName = "CustomUserMapperImpl", implementationPackage = "com.example.mappers")
public interface UserMapper {
    // ...
}

(4) unmappedTargetPolicy

指定當目標對象有未映射的屬性時的處理策略。

可選值

  • ERROR:拋出異常(默認值)。
  • WARN:生成警告日志。
  • IGNORE:忽略未映射的屬性。

示例

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface UserMapper {
    // ...
}

(5) injectionStrategy

指定依賴注入的策略。

可選值

  • FIELD:通過字段注入(默認值)。
  • CONSTRUCTOR:通過構(gòu)造函數(shù)注入。
  • METHOD:通過方法注入。

示例

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

3. 高級用法

(1) 結(jié)合@MapperConfig

可以通過@MapperConfig定義全局配置,然后在@Mapper中引用。

示例

@MapperConfig(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CommonMapperConfig {
}
@Mapper(config = CommonMapperConfig.class)
public interface UserMapper {
    // ...
}

(2) 自定義方法

可以在映射器接口中定義自定義方法,MapStruct會調(diào)用這些方法完成復雜的映射邏輯。

示例

@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. 注意事項

依賴配置

  • 確保項目中包含MapStruct的依賴和注解處理器(mapstructmapstruct-processor)。
  • 如果使用Lombok,確保Lombok的版本兼容,并在構(gòu)建工具(如Maven或Gradle)中正確配置。

映射規(guī)則

  • 如果源對象和目標對象的屬性名相同,MapStruct會自動映射。
  • 如果屬性名不同,需要通過@Mapping注解顯式指定。

性能

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

5. 總結(jié)

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

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

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

6. 編譯異常處理

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

  • 現(xiàn)象:缺少必要的注解處理器依賴,如org.mapstruct:mapstruct-processor,導致編譯時無法生成Mapper類。
  • 解決方案
    • Maven項目:在pom.xml中添加MapStruct核心庫和處理器依賴,例如:
<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項目**:在`build.gradle`中添加:
implementation 'org.mapstruct:mapstruct:1.5.3.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'

IDE設置問題

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

代碼規(guī)范問題

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

版本兼容性問題

  • 現(xiàn)象:MapStruct版本與其他依賴(如Lombok)不兼容,導致編譯異常。
  • 解決方案
    • 升級MapStruct版本:嘗試升級至最新穩(wěn)定版本,例如:
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.6.0.Final</version>
</dependency>
- **解決Lombok沖突**:如果項目中同時使用Lombok和MapStruct,特別是使用Lombok的`@Builder`注解時,可能導致`@AfterMapping`不生效。對于Lombok版本1.18.16或更高版本,需添加`lombok-mapstruct-binding`依賴:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok-mapstruct-binding</artifactId>
    <version>0.2.0</version>
</dependency>

其他可能的問題及解決方案

  • 未映射的目標屬性:檢查源對象和目標對象,確保存在對應的屬性,或使用@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注解通過傳遞上下文對象來避免無限遞歸。

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

相關(guān)文章

  • Java布爾值Boolean和boolean之間轉(zhuǎn)換實例用法

    Java布爾值Boolean和boolean之間轉(zhuǎn)換實例用法

    在本篇文章里小編給大家整理的是一篇關(guān)于Java布爾值Boolean和boolean之間轉(zhuǎn)換實例用法內(nèi)容,有需要的朋友們跟著學習參考下。
    2021-06-06
  • springboot寶塔簡單部署的實現(xiàn)示例

    springboot寶塔簡單部署的實現(xiàn)示例

    通過使用Spring Boot,可以快速構(gòu)建出高效、可擴展的應用程序,而寶塔面板則提供了簡單易用的網(wǎng)站管理和維護工具,本文將詳細介紹如何將Spring Boot應用程序與寶塔面板進行集成,實現(xiàn)自動化部署、配置管理等操作
    2023-11-11
  • springboot整合swagger3報Unable to infer base url錯誤問題

    springboot整合swagger3報Unable to infer base&nbs

    這篇文章主要介紹了springboot整合swagger3報Unable to infer base url錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Tomcat和Spring中的事件機制深入講解

    Tomcat和Spring中的事件機制深入講解

    這篇文章主要給大家介紹了關(guān)于Tomcat和Spring中事件機制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧
    2018-12-12
  • Java的Struts2框架配合Ext JS處理JSON數(shù)據(jù)的使用示例

    Java的Struts2框架配合Ext JS處理JSON數(shù)據(jù)的使用示例

    這篇文章主要介紹了Java的Struts2框架配合Ext JS處理JSON數(shù)據(jù)的使用示例,包括將Ext JS中的JSON數(shù)據(jù)解析為列表的方法,需要的朋友可以參考下
    2016-03-03
  • 基于Java實現(xiàn)一個簡單的圖片加載器

    基于Java實現(xiàn)一個簡單的圖片加載器

    這篇文章主要為大家詳細介紹了如何使用Java?2D?API(Java的繪圖和圖像API)來實現(xiàn)圖片加載和顯示,文中的示例代碼講解詳細,需要的小伙伴可以參考一下
    2023-11-11
  • 詳解jvm對象的創(chuàng)建和分配

    詳解jvm對象的創(chuàng)建和分配

    這篇文章主要介紹了jvm對象的創(chuàng)建和分配的相關(guān)資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-03-03
  • 掃二維碼自動跳轉(zhuǎn)【java】詳解

    掃二維碼自動跳轉(zhuǎn)【java】詳解

    這篇文章主要介紹了java掃二維碼自動跳轉(zhuǎn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • java對double數(shù)組排序示例分享

    java對double數(shù)組排序示例分享

    這篇文章主要介紹了java對double數(shù)組排序示例,代碼簡單,下面我們直接上代碼,需要的朋友可以參考下
    2014-03-03
  • 加快springboot項目的服務啟動時間的操作方法

    加快springboot項目的服務啟動時間的操作方法

    這篇文章給大家介紹如何加快springboot項目的服務啟動時間,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-05-05

最新評論

蓬安县| 平凉市| 华蓥市| 敦煌市| 巨野县| 札达县| 万荣县| 乌什县| 芦溪县| 宝应县| 临西县| 惠水县| 雅安市| 江西省| 兴文县| 博兴县| 彰化市| 乌苏市| 荆州市| 石景山区| 乌拉特前旗| 营山县| 慈溪市| 宁晋县| 河池市| 石首市| 礼泉县| 滁州市| 黄梅县| 涞水县| 赣州市| 江安县| 太仆寺旗| 措美县| 霍林郭勒市| 云龙县| 屏东县| 肃南| 新巴尔虎左旗| 崇文区| 宽甸|