mapstruct使用指南(2)
多个源类
有时,单个类不足以构建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)相关推荐
- Java对象转换方案分析与mapstruct实践
简介: 随着系统模块分层不断细化,在Java日常开发中不可避免地涉及到各种对象的转换,如:DO.DTO.VO等等,编写映射转换代码是一个繁琐重复且还易错的工作,一个好的工具辅助,减轻了工作量.提升开发 ...
- 【Java生态圈技术总结】之深度剖析MapStruct对象拷贝工具
目录导航 一.常用的对象拷贝工具基本介绍 1.1 Apache BeanUtils 1.2 Spring BeanUtils 1.3 cglib BeanCopier 1.4 HuTool BeanU ...
- MapStruct使用方法
文章目录 本文介绍 基本使用 Student和StudentDTO转换 使用流程 源码分析 进阶使用 MapStruct提供的一些处理器选项配置 使用Spring依赖 属性名称不一致 属性类型不一致 ...
- 【迁移2018-04-12 10:46:11】BeanCopier之MapStruct(一)
为什么80%的码农都做不了架构师?>>> 无意中见同事在比较BeanCopier的效率,MapStruct的使用者很牛皮的说我的效率是你的XX倍,今天认识了一下MapStrut ...
- 遇到MapStruct后,再也不手写PO,DTO,VO对象之间的转换了
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 介绍 在工作中,我们经常要进 ...
- 人工智能ai应用高管指南_营销商关于AI的完整指南
人工智能ai应用高管指南 If you search "AI is-" into Google, you end up with sayings from brilliant pe ...
- 超详细中文预训练模型ERNIE使用指南-源码
作者 | 高开远,上海交通大学,自然语言处理研究方向 最近在工作上处理的都是中文语料,也尝试了一些最近放出来的预训练模型(ERNIE,BERT-CHINESE,WWM-BERT-CHINESE),比对 ...
- 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题
入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...
- ASIC设计-终极指南
ASIC设计-终极指南 ASIC Design – The Ultimate Guide ASIC设计-终极指南 ASICs代表特定于应用的集成电路,指的是针对特定应用而设计的半导体解决方案,与其他解 ...
最新文章
- oracle中ddl中enable,oracle 禁用表的DDL 实现真正的READ ONLY
- php功能与特性,PHP 6将实现的8个特性和功能
- js 获取URL参数乱码解决
- 确保客户端可以接收到服务端的异常serviceDebug includeExceptionDetailInFaults=true
- 手把手教你搭建 vue 环境
- 车道线检测综述及近期新工作
- 互联网人必看的中台理论,阿里腾讯架构师用大白话讲出来了
- oracle raise默认作用,Oracle:使用RAISE_APPLICATION_ERROR的情况是什么?
- Setup Factory 提示 Invalid start mode : archive filename 的解决办法
- 小刘的每日知识点——10.22
- 手机python代码查询四六级准考证_四六级查准考证号的网站是什么
- python实现简单五子棋
- 计算机科学和物理哪个难,据说这是期末考试难度最大的15个专业,你上榜了吗?...
- linux格式化4t硬盘分区,详解:Linux 硬盘,格式化,分区 详解
- 【以太网硬件十七】什么!?网线边传数据还能边供电?
- 单位计算机网络管理员论文,计算机专业毕业论文(计算机网络管理软件的研究)教案.doc...
- iptable规则的设定与查看
- pycharm删除的文件找回步骤
- 健康档案管理系统-毕业设计-SSM框架-SpringBoot2.X-VUE-Antd-MyBatis-Shiro
- word分词器、ansj分词器、mmseg4j分词器、ik-analyzer分词器分词效果评估(转)
热门文章
- 智慧化工厂:化工厂人员定位+化工厂定位系统实现全智能化化工厂自动管理考勤-新导智能
- 去除数字的正则表达式
- matlab抢占时隙算法,基于公平性的D2D时隙调度算法
- 验证“哥德巴赫猜想”思路分析
- POJ-2566,HDU-1058,POJ-3320,POJ-3061(尺取法)
- 人的感性和理性做出的决断往往不一致,为什么
- Linux系统下查找最近修改过的文件
- html css 基本词汇
- 华为k662c的虚拟服务器,华为k662c路由器怎么设置 | 华为k662c路由器设置_什么值得买...
- ftrack Review 支持格式和分辨率