MapStruct通过一些接口定义,能自动生成实现类,将一个类转换为另一个类。

引用

1.3.1.Final

...

org.mapstruct

mapstruct

${org.mapstruct.version}

...

org.apache.maven.plugins

maven-compiler-plugin

3.5.1

1.8

1.8

org.mapstruct

mapstruct-processor

${org.mapstruct.version}

这个依赖有两个问题

不支持lombok的@Data等注解

如果接口引用的类通过@Data标记,由于标记生成getter/setter等方法,但是在生成mapstruct mapper类时看不到,会导致编译找不到属性的问题。

解决方法:引入mapstruct-processor,同时去掉plugin中的annotationProcessorPaths:

...

org.mapstruct

mapstruct-processor

1.3.1.Final

provided

...

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

...

Spring中无法通过@Autowired注入接口

这是因为生成的Mapper实现类,没有被标注@Component,通过添加maven编译参数defaultComponentModel可以解决:

...

org.apache.maven.plugins

maven-compiler-plugin

1.8

1.8

-Amapstruct.defaultComponentModel=spring

...

修改以后,我在eclipse中没有自动重新编译,需要clean再重新编译才生效。

引用Mapper

INSTANCE方式

接口中定义一个单例,其他地方引用,官方讲的比较清楚:

@Mapper

public interface CarMapper {

CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );

CarDto carToCarDto(Car car);

}

//引用Mapper

Car car = ...;

CarDto dto = CarMapper.INSTANCE.carToCarDto( car );

通过@Autowired依赖注入

需要前面配置的defaultComponentModel=spring,才能在代码中注入:

@Autowired

CarMapper carMapper;

其实上面的配置时全局的,也可以在mapper定义中,增加标记:

@Mapper(componentModel = "spring")

public interface CarMapper {

CarMapper INSTANCE = Mappers.getMapper( CarMapper.class );

CarDto carToCarDto(Car car);

}

这样也行,只不过需要一个一个的Mapper都添加,不是那么方便了。

使用

可以转换复杂的结构类型,默认是同名的属性进行转换的。

按照官方文档的说明,生成的Mapper代码也是尽量符合手写代码,通过getter/setter设置,没有使用反射,这也是为什么通过lombok添加getter/setter会生成不成功的原因。

也支持通过注解,将不同名字的类型进行自动转换。

我实验的代码:

//源类型

@Data

public class TbUserCustomDO {

private List users;

private String fieldA;

private String field2;

}

//TbUser也是一个自定义类

@Data

public class TbUser implements Serializable {

private Integer id;

private String username;

private String password;

private String name;

private Integer age;

private Integer sex;

private Date birthday;

private Date created;

private Date updated

}

//目的类

@Data

public class TbUserDemoDTO {

private List users;

private String field1;

private String field2;

}

//这里TbUserDTO与源类中的TbUser不完全相同(少一些字段),但是注意每个已有字段名称是相同的

public class TbUserDTO {

private Integer id;

private String username;

private String password;

private String name;

private Integer age;

private Integer sex;

private Date birthday;

}

//Mapper类

@Mapper

public interface TbUserCustomConverter {

//这里把fieldA对应到field1,因为名称不同

@Mapping(source = "fieldA", target = "field1")

TbUserDemoDTO doToDTO(TbUserCustomDO cDo);

}

//注入Mapper

@Autowired

TbUserCustomConverter tbUserCustomConverter;

...

//使用,这里List和属性都能成功转换

TbUserCustomDO cDo = ...

TbUserDemoDTO dto = tbUserCustomConverter.doToDTO(cDo);

eclipse使用mapstruct_MapStruct使用学习相关推荐

  1. eclipse maven配置_Gradle学习记录015 声明仓库,检查依赖,管理依赖的配置

    本片由三部分组成,第一部分声明仓库的参考链接如下: https://docs.gradle.org/current/userguide/repository_types.html 第二部分检查依赖的依 ...

  2. eclipse功能template(模板)学习。e.g : 快速在代码中插入时间戳

    说些题外话. 自己属于半路出家入行码农的类型,基础算不上好,需要大量的时间夯实. 幸好,赶上网易云课堂开放.可以花费些时间,来好好学习一下. 在此,也是特别推荐有心学习coding的同学,可以去看看. ...

  3. eclipse插件大全整理学习

    Eclipse Web Tools Platform(WTP) 地址:http://download.eclipse.org/webtools/ WTP十分强大,支持HTML, JavaScript, ...

  4. eclipse maven打包_Maven 学习

    1 Maven 简介 Maven 使用项目对象模型(POM,Project Object Model) 的概念,可以通过一小段描述信息来管理项目的构建.报告和文档的软件项目管理工具 2 Maven 的 ...

  5. eclipse开发android入门学习

    1.device窗口 查看android运行情况的窗口和DDMS内容一致(通过keymap映射eclipse快捷键到vs的快捷操作) 2.android.bat 在adb路径下运行adb操作,实现an ...

  6. Java JDK安装与配置以及Eclipse下载(Java 学习预备工作,针对windows用户学习者)

    目录 JDK下载 Path配置 CLASSPATH配置 验证是否配置成功 Eclipse下载 JDK下载 下载地址:Java Downloads | Oracle 下载完以后双击安装即可. Path配 ...

  7. eclipse paho java_Eclipse paho学习笔记

    Eclipse Paho java 支持java和android 两个客户端异步和同步, MqttAsyncClient,MqttClient 其中 后者是前者的包装同步器,特效除了5.0都支持 有两 ...

  8. JavaWeb—监听器—Eclipse版动力节点学习笔记

    JavaWeb学习笔记 监听器 Listener 哔哩哔哩蛙课网[动力节点]JavaWeb-Eclipse版学习视频网址 解释 归属 备注 ServletRequestListener Request ...

  9. eclipse使用mapstruct_MapStruct快速入门

    MapStruct是一个代码生成器,简化了不同的Java Bean之间映射的处理,所以映射指的就是从一个实体变化成一个实体.例如我们在实际开发中,DAO层的实体和一些数据传输对象(DTO),大部分属性 ...

最新文章

  1. tf.io.gfile.glob 遍历文件
  2. 让CentOS 5.5支持ext4
  3. angularjs 让当前路由重新加载_Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单...
  4. Scrapy-redis实现分布式爬取的过程与原理
  5. Axis2 WebService(配置、发布、调用)
  6. 嵌入式常见笔试题总结(2)
  7. Arcgis javascript那些事儿(十六)——GP服务的发布与使用
  8. 语音识别芯片的工作原理和分类
  9. 《算法设计与分析》黄宇编著 课后习题参考答案
  10. 标注的尺寸避让lisp_AutoCAD中尺寸公差的自动标注 一短小AutoLISP程序轻松实现.doc...
  11. python3 如何对一个数进行开方(3种方法)
  12. CMake 常用方法
  13. GitHub 中超过3.5万开源代码被投毒
  14. 【No7.】Android 像素转换工具
  15. 二分图的最大匹配-解决匹配问题
  16. C# 以GET或Post方式请求Web地址
  17. 鲁大师测试软件的算法,鲁大师是如何检测内存的?检测内存的方法
  18. 打开oracle dmp,dmp文件怎么打开?dmp是什么文件?
  19. 工作流中实现一个节点多个节点的顺序审批
  20. 现代远程教育入学指南(石油大学)--高等数学(二)在线作业

热门文章

  1. css换行后缩进,css缩进技巧
  2. 魔众网盘系统 v1.2.0 后台界面优化,系统常规升级
  3. idea服务器激活步骤(jetbrainsCrack.jar)
  4. 游戏服务端帧率控制(使用libuv中uv_now进行说明)
  5. 局域网实现PC、Pad、Android互联
  6. 机场、油库、边防、电站都在用的调频无人机干扰设备---TFN MR61
  7. 绘制典型二阶系统的单位阶跃响应曲线
  8. python --print带颜色输出
  9. 净利下滑52.9%,鲁大师布局SAAS赛道能否逆风翻盘?
  10. 深度学习中的消融实验指的是什么?