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

Java中的MapStruct的使用方法代碼實(shí)例

 更新時(shí)間:2023年10月21日 09:45:08   作者:浪浪山的猿  
這篇文章主要介紹了Java中的MapStruct的使用方法代碼實(shí)例,mapstruct是一種實(shí)體類映射框架,能夠通過Java注解將一個(gè)實(shí)體類的屬性安全地賦值給另一個(gè)實(shí)體類,有了mapstruct,只需要定義一個(gè)映射器接口,聲明需要映射的方法,需要的朋友可以參考下

一、MapStruct 簡(jiǎn)介

mapstruct是一種實(shí)體類映射框架,能夠通過Java注解將一個(gè)實(shí)體類的屬性安全地賦值給另一個(gè)實(shí)體類。有了mapstruct,只需要定義一個(gè)映射器接口,聲明需要映射的方法,在編譯過程中,mapstruct會(huì)自動(dòng)生成該接口的實(shí)現(xiàn)類,實(shí)現(xiàn)將源對(duì)象映射到目標(biāo)對(duì)象的效果。

二、MapStruct 使用

切記:使用過程中遇到問題一定要看下面的必坑指南

1.引入依賴

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.5.2.Final</version>
        </dependency>

這個(gè)依賴項(xiàng)會(huì)導(dǎo)入MapStruct的核心注釋。由于MapStruct在編譯時(shí)工作,并且會(huì)集成到像Maven和Gradle這樣的構(gòu)建工具上,我們還必須在<build中/>標(biāo)簽中添加一個(gè)插件maven-compiler-plugin,并在其配置中添加annotationProcessorPaths,該插件會(huì)在構(gòu)建時(shí)生成對(duì)應(yīng)的代碼。

   <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
              <!--以下為mapstruct所需配置--> 
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.5.2.Final</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

2. 基本映射

1.相同字段間映射

我們先從一些基本的映射開始。我們會(huì)創(chuàng)建一個(gè)UserInfo 對(duì)象和一個(gè)UserInfoDTO 對(duì)象,為了方便起見,它們的屬性字段都使用相同的名稱。

@Data
@TableName(value = "user_info")
public class UserInfo {
    private String id;
    private String name;
    private String sex;
    private String email;
}
@Data
public class UserInfoDTO {
    private String id;
    private String name;
    private String sex;
    private String email;
}

現(xiàn)在,為了在這兩者之間進(jìn)行映射,我們要?jiǎng)?chuàng)建一個(gè)UserInfoConvert接口。對(duì)該接口使用@Mapper注解,MapStruct就會(huì)知道這是兩個(gè)類之間的映射器。

@Mapper
public interface UserInfoConvert {
    UserInfoConvert INSTANCE = Mappers.getMapper(UserInfoConvert.class);
    UserInfoDTO toDTO(UserInfo userInfo);
}

這段代碼中創(chuàng)建了一個(gè)UserInfoConvert類型的實(shí)例INSTANCE,在生成對(duì)應(yīng)的實(shí)現(xiàn)代碼后,這就是我們調(diào)用的“入口”。

我們?cè)诮涌谥卸x了toDTO()方法,該方法接收一個(gè)UserInfo實(shí)例為參數(shù),并返回一個(gè)UserInfoDTO實(shí)例。這足以讓MapStruct知道我們想把一個(gè)UserInfo 實(shí)例映射到一個(gè)UserInfoDTO實(shí)例。

當(dāng)我們構(gòu)建/編譯應(yīng)用程序時(shí),MapStruct注解處理器插件會(huì)識(shí)別UserInfoConvert接口并為其生成一個(gè)實(shí)現(xiàn)類。

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-07-19T14:15:05+0800",
    comments = "version: 1.5.2.Final, compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)"
)
public class UserInfoConvertImpl implements UserInfoConvert {
    @Override
    public UserInfoDTO toDTO(UserInfo userInfo) {
        if ( userInfo == null ) {
            return null;
        }
        UserInfoDTO userInfoDTO = new UserInfoDTO();
        return userInfoDTO;
    }
}

UserInfoConvertImpl 類中包含一個(gè)toDTO()方法,將我們的UserInfo 屬性值映射到userInfoDTO 的屬性字段中。如果要將UserInfo 實(shí)例映射到一個(gè)userInfoDTO 實(shí)例,可以這樣寫:

     UserInfoDTO userInfoDTO = UserInfoConvert.INSTANCE.toDTO(userInfo);

2.不同字段間映射

通常,模型和DTO的字段名不會(huì)完全相同。由于團(tuán)隊(duì)成員各自指定命名,以及針對(duì)不同的調(diào)用服務(wù),開發(fā)者對(duì)返回信息的打包方式選擇不同,名稱可能會(huì)有輕微的變化。

注意下面兩個(gè)實(shí)體中的email字段不一致

public class UserInfo {
    private String id;
    private String name;
    private String sex;
    private String email;
}
@Data
public class UserInfoDTO {
    private String id;
    private String name;
    private String sex;
    private String myEmail;
}

現(xiàn)在,我們需要讓 UserMapper 知道這里的不一致。我們可以使用 @Mapping 注解,并設(shè)置其內(nèi)部的 source 和 target 標(biāo)記分別指向不一致的兩個(gè)字段。

@Mapper
public interface UserInfoConvert {
    UserInfoConvert INSTANCE = Mappers.getMapper(UserInfoConvert.class);
    @Mapping(target = "myEmail", source = "email")
    UserInfoDTO toDTO(UserInfo userInfo);
}

生成的實(shí)現(xiàn)類

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-07-19T15:22:09+0800",
    comments = "version: 1.5.2.Final, compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)"
)
public class UserInfoConvertImpl implements UserInfoConvert {
    @Override
    public UserInfoDTO toDTO(UserInfo userInfo) {
        if ( userInfo == null ) {
            return null;
        }
        UserInfoDTO userInfoDTO = new UserInfoDTO();
        // 注意這里,已經(jīng)自動(dòng)轉(zhuǎn)換了
        userInfoDTO.setMyEmail( userInfo.getEmail() );
        userInfoDTO.setId( userInfo.getId() );
        userInfoDTO.setName( userInfo.getName() );
        userInfoDTO.setSex( userInfo.getSex() );
        return userInfoDTO;
    }
}

三、避坑指南

1號(hào)坑

Error:(20, 5) java: No property named "***" exists in source parameter(s). Type "***" has no properties.

原因: annotationProcessorPaths中缺少lombok插件

  <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                      <!--缺少lombok-->
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.5.2.Final</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

解決辦法:annotationProcessorPaths中加上lombok插件

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <annotationProcessorPaths>
                <path>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>1.18.20</version>
                </path>
                <path>
                    <groupId>org.mapstruct</groupId>
                    <artifactId>mapstruct-processor</artifactId>
                    <version>1.5.2.Final</version>
                </path>
            </annotationProcessorPaths>
        </configuration>
    </plugin>

2號(hào)坑

Error:(20, 5) java: No property named "***" exists in source parameter(s). Type "***" has no properties.

如果annotationProcessorPaths有l(wèi)ombok和mapstruct-processor,查看lombok是否放在mapstruct-processor后面,切記lombok要放在mapstruct-processor之前。

錯(cuò)誤方式:

    <annotationProcessorPaths>
        <path>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.5.2.Final</version>
        </path>
        <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </path>
    </annotationProcessorPaths>

正確方式:

    <annotationProcessorPaths>
       <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </path>
        <path>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.5.2.Final</version>
        </path>
    </annotationProcessorPaths>

到此這篇關(guān)于Java中的MapStruct的使用方法代碼實(shí)例的文章就介紹到這了,更多相關(guān)MapStruct的使用方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • kaptcha驗(yàn)證碼使用方法詳解

    kaptcha驗(yàn)證碼使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了kaptcha驗(yàn)證碼的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Spring解決循環(huán)依賴問題的三種方法小結(jié)

    Spring解決循環(huán)依賴問題的三種方法小結(jié)

    在 Spring 中,循環(huán)依賴問題指的是兩個(gè)或多個(gè) bean 之間相互依賴形成的閉環(huán),具體而言,當(dāng) bean A 依賴于 bean B,同時(shí) bean B 也依賴于 bean A,就形成了循環(huán)依賴,本文就給大家介紹了Spring解決循環(huán)依賴問題的三種方法,需要的朋友可以參考下
    2023-09-09
  • 解決微服務(wù)中關(guān)于用戶token處理到的坑

    解決微服務(wù)中關(guān)于用戶token處理到的坑

    這篇文章主要介紹了解決微服務(wù)中關(guān)于用戶token處理到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java監(jiān)聽POST請(qǐng)求的示例詳解

    Java監(jiān)聽POST請(qǐng)求的示例詳解

    要監(jiān)聽POST請(qǐng)求,我們可以使用Java中的HttpServlet類,以下是一個(gè)使用Servlet API監(jiān)聽POST請(qǐng)求的完整示例,通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-12-12
  • java通過注解翻譯字典的實(shí)現(xiàn)示例

    java通過注解翻譯字典的實(shí)現(xiàn)示例

    本文主要介紹了java通過注解翻譯字典的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • springboot中在非bean類中調(diào)用bean的實(shí)現(xiàn)方法

    springboot中在非bean類中調(diào)用bean的實(shí)現(xiàn)方法

    在Spring Boot中,非Bean類調(diào)用Bean方法通常需要通過靜態(tài)方法獲取Bean實(shí)例,然后調(diào)用相應(yīng)的方法,這種方法避免了直接在非Bean類中注入Bean,保持了代碼的簡(jiǎn)潔和可維護(hù)性,通過這種方式,可以在不改變?cè)写a結(jié)構(gòu)的情況下,實(shí)現(xiàn)Bean方法的調(diào)用
    2025-02-02
  • idea如何關(guān)閉右側(cè)類顯示方法

    idea如何關(guān)閉右側(cè)類顯示方法

    這篇文章主要介紹了idea如何關(guān)閉右側(cè)類顯示方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java?IO流與NIO技術(shù)綜合應(yīng)用詳細(xì)實(shí)例代碼

    Java?IO流與NIO技術(shù)綜合應(yīng)用詳細(xì)實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于Java?IO流與NIO技術(shù)綜合應(yīng)用的相關(guān)資料,文中包括了字節(jié)流和字符流,以及它們的高級(jí)特性如緩沖區(qū)、序列化和反序列化,同時(shí)還介紹了NIO中的通道和緩沖區(qū),以及選擇器的使用,需要的朋友可以參考下
    2024-12-12
  • java如何使用jdbc連接TDSQL數(shù)據(jù)庫

    java如何使用jdbc連接TDSQL數(shù)據(jù)庫

    TDSQL是騰訊打造的一款分布式數(shù)據(jù)庫產(chǎn)品,具備強(qiáng)一致高可用、全球部署架構(gòu)、分布式水平擴(kuò)展、高性能、企業(yè)級(jí)安全等特性,本文我們就來看看Java如何使用jdbc連接TDSQL數(shù)據(jù)庫吧
    2025-06-06
  • 詳解Java的按位操作符

    詳解Java的按位操作符

    Java的位操作符用來操作整數(shù)基本數(shù)據(jù)類型中的單個(gè)“比特”(bit),即代進(jìn)制位。下面通過本文給大家分享Java的按位操作符,感興趣的朋友一起看看吧
    2017-09-09

最新評(píng)論

齐齐哈尔市| 宁强县| 延吉市| 东海县| 太仆寺旗| 睢宁县| 崇文区| 南皮县| 宜良县| 阳朔县| 化隆| 钦州市| 安仁县| 美姑县| 旌德县| 阳西县| 石屏县| 临夏市| 河池市| 磐安县| 安化县| 广昌县| 苍溪县| 日照市| 即墨市| 丹凤县| 宿迁市| 崇信县| 威远县| 化州市| 丹寨县| 吉木乃县| 潼南县| 凌云县| 麻江县| 蓬溪县| 九龙坡区| 赞皇县| 辽源市| 宜兴市| 司法|