MapStruct 入门使用
1. 概述
MapStruct 可以将某几种类型的对象映射为另外一种类型,如将多个Domain 对象转换为 DTO,涉及到类似之间对象转换的都可以用它来完成。其主要作用就是:Java bean mappings
详细信息可以参考最新版本的文档:MapStruct 1.3.0.Final Reference Guide
本文的内容也是来源于官方文档,只是简单的做一个简单的说明,方便理解和快速的使用。
2 引入依赖
Spring项目中的简单使用,用Maven管理依赖,在pom文件中引入MapStruct:
<org.mapstruct.version>1.3.0.Final</org.mapstruct.version><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version><scope>provided</scope></dependency>...<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.5.1</version><configuration><source>${java.version}</source><target>${java.version}</target><annotationProcessorPaths><path><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version></path></annotationProcessorPaths></configuration></plugin>
12345678910111213141516171819202122232425
注意,需要jdk1.8以上。
2. 简单使用
2.1 基础mappings
定义Mapper接口
@Mapper
public interface CarMapper {@Mapping(source = "make", target = "manufacturer") @Mapping(source = "numberOfSeats", target = "seatCount") CarDto carToCarDto(Car car);@Mapping(source = "name", target = "fullName") PersonDto personToPersonDto(Person person);}
123456789
2.2 Adding custom methods to mappers
可以使用@context注解,传入对象,起到一定的定制作用。
2.3 多个参数来源的映射
@Mapper
public interface AddressMapper {@Mapping(source = "person.description", target = "description") @Mapping(source = "address.houseNo", target = "houseNumber") DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);
12345
2.4 更新现有的 bean instances
使用@MappingTarget 传入一个bean,则更新的就是它:
@Mapper
public interface CarMapper {void updateCarFromDto(CarDto carDto, @MappingTarget Car car);}
1234
2.5 Mappings with direct field access
MapStruct同样支持没有getter/setter方法的映射。但是要求属性可以直接访问。
2.6 @AfterMapping和@BeforeMapping
在接口中实现这两个注解标注的default方法,会在映射前后调用:
@Mapper(componentModel = "spring")
public interface AddressMapper {AddressMapper MAPPER = Mappers.getMapper(AddressMapper.class);@Mapping(target = "name", source = "address.name")@Mapping(target = "gender", source = "person.gender")PersonAddressDto convert(Address address, Person person, @MappingTarget PersonAddressDto target);@AfterMappingdefault void afterMapping(Address address, @MappingTarget PersonAddressDto target) {}@BeforeMappingdefault void beforeMapping(Person person, @MappingTarget PersonAddressDto target) {}
}
1234567891011121314151617
其生成的实现类中,会分别生成前置和后置的映射:
@Component
public class AddressMapperImpl implements AddressMapper {@Overridepublic PersonAddressDto convert(Address address, Person person, PersonAddressDto target) {if ( address == null && person == null ) {return null;}//前置beforeMapping( person, target );if ( address != null ) {target.setName( address.getName() );}if ( person != null ) {target.setGender( person.getGender() );}//后置afterMapping( address, target );return target;}
}
1234567891011121314151617181920212223
4. Retrieving a mapper
4.1 The Mappers factory
org.mapstruct.factory.Mappers class. Just invoke the getMapper() method。
例如:
@Mapper(componentModel = "spring")
public interface AddressMapper {AddressMapper MAPPER = Mappers.getMapper(AddressMapper.class);@Mapping(target = "name", source = "address.name")@Mapping(target = "gender", source = "person.gender")PersonAddressDto convert(Address address, Person person);
}
123456789
getMapper方法,相当于从其实现类中new一个无参构造方法,则可以通过它调用对应的方法。
4.2 spring依赖注入
@Mapper#componentModel属性,在定义的接口上加上
@Mapper(componentModel = "spring")
1
会自动生成实现类,并使用@Component注解标注。
5. 数据类型转换
5.1 隐士类型转换
@Mapping注解:numberFormat 、dateFormat
5.2 Controlling nested bean mappings
5.3 Invoking other mappers
使用注解@Mapper(uses=XXX.class)
MapStruct 会从XXX.class中查找满足转化的方法
5.4 Passing the mapping target type to custom mappers
@MappingTarget
5.5 Passing context or state objects to custom methods
在方法中传入对象,借助这个对象来定制转换方法。借助于@Context
5.6 Mapping method selection based on qualifiers
使用qualifiers标志符,选择特定的方法来完成映射。qualifiedBy(class) 、qualifiedByName(使用@Name注解)
@Named:annotating the methods to qualify。可以用在类上和方法上。
MapStruct 入门使用相关推荐
- MapStruct入门及集成springboot
MapStruct入门及集成springboot MapStruct官网地址: http://mapstruct.org/ 1.引入依赖 maven的pom.xml ... <propertie ...
- 学习第五篇:【SpringBoot-Labs】Spring Boot 调试环境、热部署入门、Lombok、MapStruct入门
本周(8.21-8.27)将学习芋道 Spring Boot的以下文章: 8.21: 快速入门 8.22:Spring Boot 自动配置原理 .Jar 启动原理 8.23:调试环境. 热部署入门.消 ...
- 芋道 Spring Boot 对象转换 MapStruct 入门
点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RP ...
- 还在用 BeanUtils来做对象转换吗?快试试 MapStruct吧
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:阿进的写字台 https://www.cnblogs ...
- string转换bigdecimal_使用MapStruct处理恼人的bean转换
烦人的Bean 转换 对于代码中 JavaBean之间的转换, 一直是困扰我很久的事情.在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化, 非常的影响观感, 却又不得不存在.我 ...
- MapStruct使用方法
文章目录 本文介绍 基本使用 Student和StudentDTO转换 使用流程 源码分析 进阶使用 MapStruct提供的一些处理器选项配置 使用Spring依赖 属性名称不一致 属性类型不一致 ...
- list 转set_MapStruct高级用法:List和String互转
需求背景:有一个业务对象,数据库里存的是分号隔开的String,在返回给前台时需要转换成List dao类TNotice中 @ApiModelProperty(value = "附件地址,以 ...
- 学习第三篇:【SpringBoot-Labs】芋道 Spring Boot 自动配置原理
本周(8.21-8.27)将学习芋道 Spring Boot的以下文章: 8.21: 快速入门 8.22:Spring Boot 自动配置原理 .Jar 启动原理 8.23:调试环境. 热部署入门.消 ...
- 船新 IDEA 2020.3 插件大合集,个个都是精品!
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...
- PO VO DTO 转换神器替代BeanUtils 了
PO VO DTO 1. MapStruct简介 2.0 MapStruct入门 2.0.1 简易demo 2.1. 引入依赖 2.2. 需要转换的对象 2.3. 创建转换器 2.4. 验证 2.5. ...
最新文章
- UE商城资源 Motion Symphony 运动匹配插件
- mysql创建和删除用户
- python实现定时发送qq消息
- Gateway网关-过滤器链执行顺序
- 蚂蚁金服疯了吗?大动作,非裁员,年底全员涨薪又涨假期!!!
- linux命令wget下载jdk(完整解决诸多异常)
- 数据时代总结思维导图模板分享及绘制技巧
- react优秀项目案例_关于进行2019年北京市高等学校“实培计划”项目——毕业设计(创业类)项目总结与优秀项目案例征集的通知...
- adpater里写toast_Android开发UI之Toast的使用
- js操作符类型转换大全
- ubuntu服务器系统管理软件,安装 Webmin 来管理你的 Ubuntu 主机
- map转json字符串字段排序
- 8uftp是不是要保存,4步掌握8uftp保存密码的方法
- JSONP原理以及示例
- iOS永久不掉签名工具,TrollStore超详使用教程
- Windows基础篇学习(上)
- Java获取电脑外网ip地址方法
- 没有投屏标志怎么投屏_没有【TV】小图标,手机怎么投屏电视
- windows server 一键启用图片查看器
- python_变量特性、作用域、函数
热门文章
- Apache Struts ‘includeParams’安全绕过漏洞
- LeetCode: Substring with Concatenation of All Words
- 升级成员服务器-从Windows 2012升级到2016案例之2
- UnicodeEncodeError: #39;ascii#39; codec can#39;t encode character u#39;\u5929#39; in position 2...
- PHP 判断常量,变量和函数是否存在
- RUP大讲堂(第五讲)-基于用例的需求工程技术
- 28.卷1(套接字联网API)---原始套接字
- 1.Yii2 -- Controller, Request, Response, Cookie, Session
- 17、1.7 eclipse使用入门
- 【转】linux kernel 网络协议栈之GRO(Generic receive offload)