阅读 1016

mapstruct解放Java对象转换

摘要

当前web后端开发,都是使用多层工程结构,需要在VO,BO,DTO,DO等各种数据结构中相互转换。这些转换代码都是些比较简单的字段映射,类型转换,重复性工作比较高,可以使用一些工具解放我们的双手

技术方案

实现类转换的方案很多,不同方案有优缺点,需要开发者自行取舍

方案优点缺点
手写代码1. 灵活性高 2.方便后续重构1. 重复性工作多 2. 手写代码容易遗漏掉有些字段
BeanUtils.copyProperties 使用反射实现1. 使用简单 2. Apache 的包效率比较低,spring的包效率可以接受1. 复杂场景支持不足,控制copy粒度太粗 2. 不易重构
mapstruct1. 灵活性高支持简单,复杂,嵌套,自定义扩展等多种手段 2. 编译期生成,没有效率问题不方便后续重构

方便后续重构

方便后续重构的意思是当你需要更改DTO字段时,可以利用编译器的引用关系直接refactor掉

综上考虑mapstruct方案优于beanutils.copy,和手写方案对比,有一定劣势,需要取舍。个人意见,对于改字段重构,这种应该通过测试用例去保证,而不是依赖编辑器的功能。此外使用mapstruct进行转换后,类引用关系还在,重构可以通过识别类的粒度,来保证不出错。如果再考虑到手工党的出错概率,和开发效率mapstruct显然更优。

实现

  1. 引入依赖包
<properties>
    <org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
</properties>
...
<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>${org.mapstruct.version}</version>
    </dependency>
</dependencies>
复制代码
  1. 为maven compile plugin 设置annotation processor
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source> <!-- depending on your project -->
                <target>1.8</target> <!-- depending on your project -->
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>${org.mapstruct.version}</version>
                    </path>
                       <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.10</version>
                    </path>
                    <!-- other annotation processors -->
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>
复制代码
  1. IDEA 安装一个mapstruct 插件 有了这个插件后,可以找到映射类的属性,一些拼写校验

常用用法

默认情况下,当属性值与目标实体的名称相同时,就会隐式映射

其他通用转换

属性值不相同时

@Mapping(target="dateEnd", source="end")
ExampleVO doToVO(ExampleDO do);
复制代码

Collection对象转换

@Mapping(target="dateEnd", source="end")
ExampleVO doToVO(ExampleDO do);

List<ExampleVO> doToVOS(List<ExampleDO> dos)
复制代码

JAVA 构造器

通过expression 来调用Java代表

@Mapping(target="dateEnd", expression="java(new java.util.Date())"
ExampleVO doToVO(ExampleDO do);
复制代码

qualifiedByName

如果构造器满足不了,还可以自定义方法,然后再调用

@Mapping(target="dateEnd", qualifiedByName="format", source="end")
ExampleVO doToVO(ExampleDO do);
@Named("format")
default Date formatDate(Long date) {
xxx
}
复制代码

接口默认实现

mapstruct是用户定义接口,然后自动生成实现类,如果转换类中有非常定制的转换,不想通过mapstruct来转换,我们可以直接使用接口默认实现

当然还有其他功能可以使用,比如Decorator,这里不再一一列举,更多丰富的功能可以查看mapstruct 细节使用

参考

blog.csdn.net/w605283073/…

mapstruct 细节使用