在一个项目的不同模块或不同需求中,经常需要一个数据模型的一部分,需要进行对象与对象之间的互相转换。
最为简单直接的就是使用getter,setter方法进行转换,或者使用自定义Beans.copyProperties等实现。
前者编写麻烦,后者使用反射的方式导致性能消耗较大
MapStruct是一个属性映射工具、框架。通过生成这些繁琐的代码来节省时间。
- GitHub: mapstruct/mapstruct
以SpringBoot+Lombok+MapStruct为例,其余场景见 GitHub示例代码
...使用 创建pojo... 1.5.2.Final 1.18.20 0.2.0 ... org.mapstruct mapstruct ${org.mapstruct.version} org.projectlombok lombok ${org.projectlombok.version} provided ... org.apache.maven.plugins maven-compiler-plugin 3.8.1 1.8 1.8 org.mapstruct mapstruct-processor ${org.mapstruct.version} org.projectlombok lombok ${org.projectlombok.version} org.projectlombok lombok-mapstruct-binding ${lombok-mapstruct-binding.version}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Boy {
private String name;
private Integer age;
private String school;
private String blog;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Man {
private String name;
private Integer age;
private String work;
private String blogName;
}
创建映射器 配置 属性
- 公共属性:name,age
- Boy独有属性:school
- Man独有属性:work
- 不同名属性:blog / blogName
-
mapstruct.suppressGeneratorTimestamp
-
禁止在生成的映射器中创建时间戳
-
默认false
-
mapstruct.supppressGeneratorVersionInfoComment
- 禁止在生成的映射器中创建属性
- 默认为false
-
mapstruct.defaultComponentModel
- 基于生成映射器的组件模型的名称,支持default,cdi, spring, jsr30
- 默认default,使用spring可以使用@Autowired方式注入
-
-
mapstruct.unmappedTargetPolicy
- 在未使用source值填充映射方法的target属性的情况下要应用的默认报告策略,支持ERROR(映射代码生成失败)、WARN(构建时引起警告)、IGNORE(忽略)
- 默认为WARN,如Warning:(36, 24) java: Unmapped target property: .....
- 在未使用source值填充映射方法的target属性的情况下要应用的默认报告策略,支持ERROR(映射代码生成失败)、WARN(构建时引起警告)、IGNORE(忽略)
@Mapper(componentModel="spring", ....)配置方式二:pom配置
映射器实现org.apache.maven.plugins maven-compiler-plugin 3.8.1 1.8 1.8 org.mapstruct mapstruct-processor ${org.mapstruct.version} -Amapstruct.suppressGeneratorTimestamp=true -Amapstruct.suppressGeneratorVersionInfoComment=true
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public Interface ObjectConvertor(){
@Mapping(source = "blog", target = "blogName")
Man boy2Student(Boy boy);
}
使用
- List等对象需要先有其中元素对象的转换方法。
- 由于生成的代码直接为.class文件,如果是对pojo的属性做出调整,重新运行时不会再重新生成,导致类型转换出错,需要ReBuild。
@Autowired
ObjectConvertor objectConvertor;
public void objConvert() {
Boy boy = new Boy("zang", 18, "zjut", "zang.gold");
System.out.println(boy);
Man man = objectConvertor.boy2Student(boy);
System.out.println("After convert: ");
System.out.println(man);
}
~$: Boy(name=zang, age=18, school=zjut, blog=zang.gold) ~$: After convert: ~$: Man(name=zang, age=18, work=null, blogName=zang.gold)



