前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mapstruct解放Java对象转换

mapstruct解放Java对象转换

作者头像
方丈的寺院
发布2020-08-05 11:17:07
2.5K0
发布2020-08-05 11:17:07
举报
文章被收录于专栏:方丈的寺院

摘要

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

技术方案

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

方案

优点

缺点

手写代码

1. 灵活性高 2.方便后续重构

1. 重复性工作多 2. 手写代码容易遗漏掉有些字段

BeanUtils.copyProperties 使用反射实现

1. 使用简单 2. Apache 的包效率比较低,spring的包效率可以接受

1. 复杂场景支持不足,控制copy粒度太粗 2. 不易重构

mapstruct

1. 灵活性高支持简单,复杂,嵌套,自定义扩展等多种手段 2. 编译期生成,没有效率问题

不方便后续重构

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

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

实现

  1. 引入依赖包
代码语言:javascript
复制
<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
代码语言:javascript
复制
<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 插件 有了这个插件后,可以找到映射类的属性,一些拼写校验

常用用法

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

其他通用转换

属性值不相同时

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

Collection对象转换

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

List<ExampleVO> doToVOS(List<ExampleDO> dos)

JAVA 构造器

通过expression 来调用Java代表

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

qualifiedByName

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

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

接口默认实现

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

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

参考

https://blog.csdn.net/w605283073/article/details/107371462

mapstruct 细节使用

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 方丈的寺院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 技术方案
  • 实现
  • 常用用法
    • 属性值不相同时
      • Collection对象转换
        • JAVA 构造器
          • qualifiedByName
            • 接口默认实现
            • 参考
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档