多个源类

有时,单个类不足以构建DTO,我们可能希望将多个类中的值聚合为一个DTO,供终端用户使用。这也可以通过在@Mapping注解中设置适当的标志来完成。

我们先新建另一个对象 Education:

public class Education {private String degreeName;private String institute;private Integer yearOfPassing;// getters and setters or builder
}

然后向 DoctorDto中添加一个新的字段:

public class DoctorDto {private int id;private String name;private String degree;private String specialization;// getters and setters or builder
}

接下来,将 DoctorMapper 接口更新为如下代码:

@Mapper
public interface DoctorMapper {DoctorMapper INSTANCE = Mappers.getMapper(DoctorMapper.class);@Mapping(source = "doctor.specialty", target = "specialization")@Mapping(source = "education.degreeName", target = "degree")DoctorDto toDto(Doctor doctor, Education education);
}

我们添加了另一个@Mapping注解,并将其source设置为Education类的degreeName,将target设置为DoctorDto类的degree字段。

如果 Education 类和 Doctor 类包含同名的字段,我们必须让映射器知道使用哪一个,否则它会抛出一个异常。举例来说,如果两个模型都包含一个id字段,我们就要选择将哪个类中的id映射到DTO属性中。

子对象映射

多数情况下,POJO中不会包含基本数据类型,其中往往会包含其它类。比如说,一个Doctor类中会有多个患者类:

public class Patient {private int id;private String name;// getters and setters or builder
}

在Doctor中添加一个患者列表List

public class Doctor {private int id;private String name;private String specialty;private List<Patient> patientList;// getters and setters or builder
}

因为Patient需要转换,为其创建一个对应的DTO:

public class PatientDto {private int id;private String name;// getters and setters or builder
}

最后,在 DoctorDto 中新增一个存储 PatientDto的列表:

public class DoctorDto {private int id;private String name;private String degree;private String specialization;private List<PatientDto> patientDtoList;// getters and setters or builder
}

在修改 DoctorMapper之前,我们先创建一个支持 Patient 和 PatientDto 转换的映射器接口:

@Mapper
public interface PatientMapper {PatientMapper INSTANCE = Mappers.getMapper(PatientMapper.class);PatientDto toDto(Patient patient);
}

这是一个基本映射器,只会处理几个基本数据类型。

然后,我们再来修改 DoctorMapper 处理一下患者列表:

@Mapper(uses = {PatientMapper.class})
public interface DoctorMapper {DoctorMapper INSTANCE = Mappers.getMapper(DoctorMapper.class);@Mapping(source = "doctor.patientList", target = "patientDtoList")@Mapping(source = "doctor.specialty", target = "specialization")DoctorDto toDto(Doctor doctor);
}

因为我们要处理另一个需要映射的类,所以这里设置了@Mapper注解的uses标志,这样现在的 @Mapper 就可以使用另一个 @Mapper映射器。我们这里只加了一个,但你想在这里添加多少class/mapper都可以。

我们已经添加了uses标志,所以在为DoctorMapper接口生成映射器实现时,MapStruct 也会把 Patient 模型转换成 PatientDto ——因为我们已经为这个任务注册了 PatientMapper

显然,除了toDto()映射方法外,最终实现中还添加了一个新的映射方法——patientListToPatientDtoList()。这个方法是在没有显式定义的情况下添加的,只是因为我们把PatientMapper添加到了DoctorMapper中。

该方法会遍历一个Patient列表,将每个元素转换为PatientDto,并将转换后的对象添加到DoctorDto对象内中的列表中。

mapstruct使用指南(2)相关推荐

  1. Java对象转换方案分析与mapstruct实践

    简介: 随着系统模块分层不断细化,在Java日常开发中不可避免地涉及到各种对象的转换,如:DO.DTO.VO等等,编写映射转换代码是一个繁琐重复且还易错的工作,一个好的工具辅助,减轻了工作量.提升开发 ...

  2. 【Java生态圈技术总结】之深度剖析MapStruct对象拷贝工具

    目录导航 一.常用的对象拷贝工具基本介绍 1.1 Apache BeanUtils 1.2 Spring BeanUtils 1.3 cglib BeanCopier 1.4 HuTool BeanU ...

  3. MapStruct使用方法

    文章目录 本文介绍 基本使用 Student和StudentDTO转换 使用流程 源码分析 进阶使用 MapStruct提供的一些处理器选项配置 使用Spring依赖 属性名称不一致 属性类型不一致 ...

  4. 【迁移2018-04-12 10:46:11】BeanCopier之MapStruct(一)

    为什么80%的码农都做不了架构师?>>>    无意中见同事在比较BeanCopier的效率,MapStruct的使用者很牛皮的说我的效率是你的XX倍,今天认识了一下MapStrut ...

  5. 遇到MapStruct后,再也不手写PO,DTO,VO对象之间的转换了

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 介绍 在工作中,我们经常要进 ...

  6. 人工智能ai应用高管指南_营销商关于AI的完整指南

    人工智能ai应用高管指南 If you search "AI is-" into Google, you end up with sayings from brilliant pe ...

  7. 超详细中文预训练模型ERNIE使用指南-源码

    作者 | 高开远,上海交通大学,自然语言处理研究方向 最近在工作上处理的都是中文语料,也尝试了一些最近放出来的预训练模型(ERNIE,BERT-CHINESE,WWM-BERT-CHINESE),比对 ...

  8. 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题

    入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...

  9. ASIC设计-终极指南

    ASIC设计-终极指南 ASIC Design – The Ultimate Guide ASIC设计-终极指南 ASICs代表特定于应用的集成电路,指的是针对特定应用而设计的半导体解决方案,与其他解 ...

最新文章

  1. oracle中ddl中enable,oracle 禁用表的DDL 实现真正的READ ONLY
  2. php功能与特性,PHP 6将实现的8个特性和功能
  3. js 获取URL参数乱码解决
  4. 确保客户端可以接收到服务端的异常serviceDebug includeExceptionDetailInFaults=true
  5. 手把手教你搭建 vue 环境
  6. 车道线检测综述及近期新工作
  7. 互联网人必看的中台理论,阿里腾讯架构师用大白话讲出来了
  8. oracle raise默认作用,Oracle:使用RAISE_APPLICATION_ERROR的情况是什么?
  9. Setup Factory 提示 Invalid start mode : archive filename 的解决办法
  10. 小刘的每日知识点——10.22
  11. 手机python代码查询四六级准考证_四六级查准考证号的网站是什么
  12. python实现简单五子棋
  13. 计算机科学和物理哪个难,据说这是期末考试难度最大的15个专业,你上榜了吗?...
  14. linux格式化4t硬盘分区,详解:Linux 硬盘,格式化,分区 详解
  15. 【以太网硬件十七】什么!?网线边传数据还能边供电?
  16. 单位计算机网络管理员论文,计算机专业毕业论文(计算机网络管理软件的研究)教案.doc...
  17. iptable规则的设定与查看
  18. pycharm删除的文件找回步骤
  19. 健康档案管理系统-毕业设计-SSM框架-SpringBoot2.X-VUE-Antd-MyBatis-Shiro
  20. word分词器、ansj分词器、mmseg4j分词器、ik-analyzer分词器分词效果评估(转)

热门文章

  1. 智慧化工厂:化工厂人员定位+化工厂定位系统实现全智能化化工厂自动管理考勤-新导智能
  2. 去除数字的正则表达式
  3. matlab抢占时隙算法,基于公平性的D2D时隙调度算法
  4. 验证“哥德巴赫猜想”思路分析
  5. POJ-2566,HDU-1058,POJ-3320,POJ-3061(尺取法)
  6. 人的感性和理性做出的决断往往不一致,为什么
  7. Linux系统下查找最近修改过的文件
  8. html css 基本词汇
  9. 华为k662c的虚拟服务器,华为k662c路由器怎么设置 | 华为k662c路由器设置_什么值得买...
  10. ftrack Review 支持格式和分辨率