mapstruct入门

不知道什么时候mapstruct 突然冒了出来,以良好性能和易用性很快俘获了一大批程序的芳心。

但是初次体验mapstruct的时候却碰到了各种各样的问题,搞得很有挫折感。下面总结一下更简洁全面的入门教程,以及一些才过的坑。希望对大家有帮助。

本文以maven项目为例,

第一步添加依赖:

mapstruct 主要有两个组件mapstruct-jdk8 和mapstruct-processor

<dependency>
   <groupId>org.mapstruct</groupId>
   <artifactId>mapstruct-jdk8</artifactId>
   <version>1.4.1.Final</version>
</dependency>
<dependency>
   <groupId>org.mapstruct</groupId>
   <artifactId>mapstruct-processor</artifactId>
   <version>1.4.1.Final</version>
</dependency>

第二步 在build plugin中增加 maven-compile-plugin 并配置 mapstruct-processor 到annotationProcessorPaths,另外 如果模型代码用到了lombok,也请将lombok一并配置到annotationProcessorPaths。

具体示例如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.4.1.Final</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.16.22</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

第三步: 创建 mapper 

Mapper的创建实际上很简单 只要声明一个接口,加上Mapper 注解 ,然后声明转换方法就ok了。

~~~DTO

public class UserDTO {

Long id;

String name;

String gender;

String email;

}

~~~entity

public class User {

Long id;

String name;

String gender;

String email;

}

~~~mapper

import org.mapstruct.Mapper;

import org.mapstruct.factory.Mappers;

@Mapper

public interface UserDTOMapper {

UserDTOMapper INSTANCE = Mappers.getMapper(UserDTOMapper.class);

User fromDTO(UserDTO dto);

UserDTO toDTO(User user);

}

~~~Service中使用mapper

public class UserService  {

private UserRepository repo;

public boolean addUser(UserDTO dto) {

 User user =  UserDTOMapper.INSTANCE.fromDTO(dto);

 repo.persist(user)

}

public UserDTO loadUser(String id) {

  User user = repo.loadById(id)

  UserDTO dto = UserDTOMapper.INSTANCE.toDTO(user);  

return dto;

}

}

踩过的坑:

1 报告 could not retrieve mapper annotation

这个问题多半是由于项目中有swagger。 swagger里面包含了mapstruct 和新加的mapstruct-jdk8 冲突了。 只要在swagger的依赖中exclude掉 mapstruct 依赖就可以了。

<dependency>
   <groupId>io.springfox</groupId>
   <artifactId>springfox-swagger-ui</artifactId>
   <version>2.9.2</version>
   <exclusions>
      <exclusion>
         <groupId>io.springfox</groupId>
         <artifactId>springfox-spring-web</artifactId>
      </exclusion>
      <exclusion>
         <groupId>org.mapstruct</groupId>
         <artifactId>mapstruct</artifactId>
      </exclusion>
   </exclusions>
</dependency>

根据引用,如果MapStruct找不到映射方法,它将尝试生成一个自动的映射方法来处理源和目标属性之间的映射。这意味着,如果你没有显式地定义映射方法,MapStruct会自动生成一个。 另外,你可以参考引用中的官方文档了解更多关于映射引用对象的信息。该文档提供了详细的指南和示例。 关于在Spring Boot中配置MapStruct,请参考引用中提供的连接。连接中提供了在Gradle文件中配置MapStruct的示例代码。你可以按照这个示例进行配置,并且根据你的具体需求进行相应的调整。 总结起来,如果你在使用MapStruct时遇到找不到映射方法的问题,你可以尝试让MapStruct自动生成映射方法。此外,你可以查阅官方文档以获得更多关于映射引用对象以及在Spring Boot中配置MapStruct的信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MapStruct入门到出门(二)](https://blog.csdn.net/printf_scnaf/article/details/125292697)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [gradle配置mapstruct和jpa](https://blog.csdn.net/qq_23165823/article/details/100541923)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值