在代码开发过程中,大型系统进行微服务化拆分,各个核心模块也会进行必要的业务代码分层,层与层之间参数传导过程中,各参数实体对像的属性传递等也变得越来越重要,这个过程中,大量的套路式代码get/set等也会出现在属性传递过程中,mapstruct即为解决这部分套路式代码提供了良好的解决方案,实际使用过程中,定议基于target/source的接口,同时添加不同属性名的映射,即可在编译过程中自动生成对应的实现,极大的简化了操作
MAVEN依赖
<dependency> |
测试Demo
测试目录结构
基本对像
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor public class School { private String schoolName; private Student st; } @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Student { private String name; private int age; } @Data @Builder @NoArgsConstructor @AllArgsConstructor public class SchoolDO { private String schoolName; private StudentDO stNew; } @Data @Builder @NoArgsConstructor @AllArgsConstructor public class StudentDO { private String name; private int newAge; } |
通用方式-1
使用基础的泛型接口,实际接口直接继承泛型接口使用
l 字段属性名一致情况下无需再额外定义转换函数
l 如有字段属性名不一致,仅需重载单条记录的转换函数,同时添加map映射source/target的属性名
l Eg: StudentConvert, 仅一个简单接口即实现了数据的转换,属性名也作了映射
public interface BasicMapper<SOURCE, TARGET> { /** * @Mappings({ * @Mapping(source = "code", target = "newCode"), * @Mapping(source = "name", target = "newName") * }) */ @Mappings({}) @InheritConfiguration TARGET to(SOURCE source); @InheritConfiguration List<TARGET> to(Collection<SOURCE> source); @Component @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) public static void main(String[] args) { SpringApplication.run(StructTest.class, args); ApplicationContext context = SpringUtil.getApplicationContext(); StudentConvert stConvert = context.getBean(StudentConvert.class); /** * 实际转换中直接可单条或是多条list记录,并且有属性名不一致也可以 * mapper接口中指定 */ Student st = Student.builder().name("student").age(18).build(); Student st2 = Student.builder().name("student2").age(180).build(); List<Student> stList = Lists.newArrayList(st, st2); List<StudentDO> stDos = stConvert.to(stList); System.out.println(stDos.toString()); }
|
通用方式-2
嵌套转换
l 对像本身要作属性的映射转换
l 对像内某些属性也需作属生的映射转换
定议外层的映射接口,在接口中直接指定该属性对像的转换类,如下School对像中的student属性也要作相应的属性转换,可接口中直接指定 uses = {StudentConvert.class}:
@Component @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, uses = {StudentConvert.class}) @SpringBootApplication public class StructTest {
|
通用方式-3
l Source对像中的属性对像中的属性转target属性
l target对像中的属性对像中的属性转source属性
l 表达式取值(枚举类/常量)
l 调用自定义函数取值映射
@Mappings( @Mapping(source = "orderItem.discountInfo", target = "discountInfo") @Mappings({ @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, @Component |