MapStruct复制失败,属性为null,与lombok有关系

2024-01-03 00:08

本文主要是介绍MapStruct复制失败,属性为null,与lombok有关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

只要我不努力,老板就永远也过不上他想要的生活

前言

今天我搭建项目的时候发现,使用MapStruct复制对象失败了,复制后所有的对象属性都为null。我一再检查,确信自己依赖没有引入错误,也没有什么特殊的配置,就是很简单的一个对象复制。
然后我就在网上查,网上找,都不尽如意。我之前搭的一个demo就一下子成功了,没有丝毫问题。于是我就把那个demo与这个项目比对一下,到底有什么区别,是什么导致那个demo能成功,这个项目就失败呢?

与Lombok有关系

终于让我发现了问题所在,大家可能觉得是不是lombok版本的问题?出乎我的意料,它不是版本问题,而是依赖引入的顺序问题。这怎么可能呢?我来来回回做了两遍实验,确认了这个事实。
将lombok的依赖放在它的上面就解决了这个问题

问题复现

首先我们复现一下问题,看以下代码是个很简单的对象拷贝,但是它的结果却是null
请添加图片描述
这是怎么回事呢?我们知道MapStruct会生成一个实现类,我们就看看这个实现类里的代码是怎么样的?
请添加图片描述
这就很奇怪了,怎么没有set get方法,lombok失效了吗?这个代码妥妥的都是null啊。于是我就跟之前的一个demo对比。尤其是pom文件,终于让我发现了华点。
请添加图片描述
我发现,lombok的顺序不一样,成功的demo在MapStruct上边,失败的本项目在MapStruct下边。当我想到这个的时候,我的第一反应是怎么可能呢?当然,有人可能会问为什么不是lombok版本的问题呢?关于版本问题我已经试过了,依然是失败的。
于是,我就没报什么希望,随便试一试,把lombok往前放,从最下面放在了最上面
请添加图片描述
然后再运行开头的那个方法,它竟然成功了。这就很神奇了。这个依赖的引入顺序怎么会影响它的编译呢?
希望遇到这个问题的同学,注意一下,很小的问题,但是很奇葩。

这篇关于MapStruct复制失败,属性为null,与lombok有关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/564035

相关文章

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

Conda虚拟环境的复制和迁移的四种方法实现

《Conda虚拟环境的复制和迁移的四种方法实现》本文主要介绍了Conda虚拟环境的复制和迁移的四种方法实现,包括requirements.txt,environment.yml,conda-pack,... 目录在本机复制Conda虚拟环境相同操作系统之间复制环境方法一:requirements.txt方法

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使