带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(8)

简介: 带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(8)

带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(7)https://developer.aliyun.com/article/1339757?groupCode=taobaotech


探究引入顺序

 

本文在第一章提到,引入MapStruct时,必须要注意Lombok包与MapStruct包的顺序,关于这一点,网上很少有  相关文章提及。

 

问题来源

 

在复现《告别BeanUtils,Mapstruct入门到精通》代码时,文中提到的引入顺序是这样的:

 

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>

 

 

实践发现,在一个空工程中,如果按照上述写法引入MapStruct,其并不能正常工作。

 

而当修改引入顺序为以下方案时,则MapStruct可以正常使用。

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.0.Final</version>
</dependency>

 

进一步测试发现,只有mapstruct-processor包在lombok包下面时,MapStruct才能够正常使用。

 

MapStruct基本原理

 

为了探究上述问题产生的原因,我们首先要理解MapStruct的基本原理。

 

MapStruct与其他Bean映射库最大的不同就是,其在编译期间生成转换代码,而不是在运行时通过反射生成代 码。

 

为了更直观的理解这一点,可以从target中找到MapStruct自动生成的对应的ConveterImpl类,如下图所示:

image.png

 

 

 

即MapStruct为我们编写的Convert抽象类自动生成了一个实现。

而Lombok也是在编译时自动生成代码,那么问题大概率就出现在这里了。

 

带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(9)https://developer.aliyun.com/article/1339755?groupCode=taobaotech

相关文章
|
前端开发 JavaScript
JavaScript快捷方式:15个简写技巧,让你的代码事半功倍!
JavaScript快捷方式:15个简写技巧,让你的代码事半功倍!
|
API
Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题
Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题
1139 0
Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题
|
9月前
|
JavaScript 安全 API
Vue 3 emit 参数数量不匹配问题深度解析与最佳实践
本文深入解析 Vue 3 中 `emit` 参数数量错误问题,剖析 TypeScript 类型校验机制,提供四种解决方案:修正调用参数、函数重载、运行时验证与对象语法。结合统一事件管理与组合式函数封装,助你构建类型安全、可维护的组件通信体系。
409 10
|
11月前
|
前端开发
Promise的then方法返回的新Promise对象有什么特点?
Promise的then方法返回的新Promise对象有什么特点?
697 2
|
JavaScript
可自由配置的jQuery消息提示框插件toast
jquery.toast.js是一款可自由配置的jQuery消息提示框插件。该消息提示框可以自定义背景和前景色,提示框的位置,提示框的显示时间,提示框的动画效果等。
591 2
|
Java 编译器 测试技术
|
缓存 监控 Java
【建议收藏】Tomcat 优化总结
以上是V 哥整理的 Tomcat 优化的一些点,希望对你有所帮助,目前Tomcat已更新到11版本,你在项目中是使用哪个版本呢,如果有一些独到的优化策略,欢迎留言告诉我,感谢。
719 0
|
JavaScript API
给 element-plus 增加一个防抖的功能(一)
element-plus 功能非常强大,但是好像只有 el-autocomplete 提供了一个防抖功能,其他表单子控件并没有提供防抖功能,而 el-autocomplete 的防抖和我想要的效果又不太一样,所以只好写个函数实现我想要的防抖效果。
|
JavaScript 前端开发
JavaScript中call()与apply()的作用与区别?
JavaScript中call()与apply()的作用与区别?
401 3

热门文章

最新文章