使用Mapstruct进行对象转换(一)

147 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第二十八天,点击查看活动详情


由于项目中需要将不同对象参数相互赋值,其中有较为复杂的对象,且参数名不相同,所以不能直接使用 BeanUtils.copyProperties(e, r)来进行对象数据转换,于是研究了一下mapstruct。

使用mapstruct只需要定义一个映射器接口,在编译的时候mapstruct会自动生成繁琐复杂的代码来映射源对象和目标对象,而不是通过反射,这种方式能够更快的进行参数的赋值操作。

  1. 简介

MapStruct 是一个 Java 注释处理器,用于生成类型安全的 bean 映射类。

  1. 引入pom依赖
<!--mapStruct依赖-->
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.4.2.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-jdk8</artifactId>
    <version>1.4.2.Final</version> 
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.4.2.Final</version>
</dependency>

Lombok依赖:(版本最好在1.16.16以上,否则会出现问题)MapStruct通常是和lombok一起使用

<dependency> 
    <groupid>org.projectlombok</groupid> 
    <artifactid>lombok</artifactid>
    <version>${lombok.version}</version>
</dependency>
  1. 简单使用

如果是两个简单对象数据相互转换,如Test1对象的数据赋值到Test2中

Test1对象为:

@Data
public class Test1{
    private String name;
    private String age;
}

Test2对象为:

@Data
public class Test2{
    private String name;
    private String age;
}

要创建映射器,只需使用所需的映射方法定义 Java 接口并使用注解对其进行org.mapstruct.Mapper注解

所以想要进行这两个对象的转换,需要定义一个方法

@Mapper(componentModel = "testMapper")
public interface TestMapper {

    InvoiceDataMapper INSTANCE = Mappers.getMapper(TestMapper.class);
    
    Test2 test1toTest2(Test1 test1);

调用方法的方式为:

Test2 test2 = TestMapper.INSTANCE.test1toTest2(test1);

由于这两个对象中的参数名都相同,所以不需要特别指定映射的对象名,如果两个互相赋值的对象中参数名不相同则需要使用@Mapping注解指定其名称。

下一章将讲述一下mapstruct不同参数名的相互映射。