前言
mapstruct是一个进行VO,DO,DTO各类型对象之间相互转换的一个工具。
可以使用这个工具快速的在一些拥有公共属性的类之间进行属性的快速赋值。
并且使用mapstruct的效率远高于BeanUtil,众所周知BeanUtil是不被在开发中允许使用的。
其底层是在代码编译后,为项目动态的生成一些代码,如下
配置
<org.mapstruct.version>1.5.3.Final</org.mapstruct.version> <org.projectlombok.version>1.18.12</org.projectlombok.version> <!-- 不是必备 只是为了懒,不用写get set方法 必须放在mapstuct依赖的前面--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!-- mapStruct 对象转换 --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${org.mapstruct.version}</version> </dependency> <!-- idea 2018.1.1 之前的版本需要添加下面的配置, 后期的版本就不需要了,可以注释掉,我自己用的2022.1 --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </dependency> <build> <!--关于lombok和mapstruct的版本兼容问题多说几句, maven插件要使用3.6.0版本以上、lombok使用1.16.16版本以上, 另外编译的lombok mapstruct的插件不要忘了加上 否则会出现下面的错误:No property named "aaa" exists in source parameter(s). Did you mean "null"? 这种异常就是lombok编译异常导致缺少get setter方法造成的。 还有就是缺少构造函数也会抛异常。--> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <annotationProcessorPaths> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${org.projectlombok.version}</version> </path> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
首先,我在注释里面已经写了,在pom文件中,要求lombok这个依赖的位置是在mapstruct上面的,否则会导致属性转换的时候,目标属性的各个属性都是null
项目使用
这里可以使用mapstruct提供的一些注解来帮助我们设定属性的对应关系。
比如,这是第一种情况,如果两个实体中 有几个字段命名不一致,可以使用@Mapping 解决
同时,我们也可以在集合之间完成属性的转换
同时,如果说目标对象的属性来源不止一个类,则可以使用如下方式
同时,还提供了如下方式来将mapstuct动态生成的实现类作为一个Bean来使用