携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第二十八天,点击查看活动详情
由于项目中需要将不同对象参数相互赋值,其中有较为复杂的对象,且参数名不相同,所以不能直接使用 BeanUtils.copyProperties(e, r)来进行对象数据转换,于是研究了一下mapstruct。
使用mapstruct只需要定义一个映射器接口,在编译的时候mapstruct会自动生成繁琐复杂的代码来映射源对象和目标对象,而不是通过反射,这种方式能够更快的进行参数的赋值操作。
- 简介
MapStruct 是一个 Java 注释处理器,用于生成类型安全的 bean 映射类。
- 引入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>
- 简单使用
如果是两个简单对象数据相互转换,如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不同参数名的相互映射。