Lombok 与 EasyExcel 兼容性问题解析及建议
在 Java 开发中,Lombok 被广泛用于减少样板代码,如 Getter、Setter、构造函数等。然而,在与像 EasyExcel 这样依赖反射机制的库一起使用时,可能会遇到一些意想不到的问题。本文将深入探讨 Lombok 与 EasyExcel 之间的兼容性问题,分析原因,并提供相应的解决方案和建议。
简单版
如果是需要映射的实体类,老老实实的不要去用Lombok的注解,不要去用就对了,不用就没有兼容性或者其他可能的冲突。
一、问题背景
在使用 Lombok 的 @Getter
和 @Setter
注解简化代码时,开发者可能会发现:
- EasyExcel 无法正确赋值对象的属性,读取的结果为
null
。 - 反射调用失败,导致数据解析错误或抛出异常。
这种情况尤其常见于使用 Lombok 自动生成的 Getter 和 Setter 方法与 EasyExcel 等依赖反射的库结合使用时。
二、Lombok 的工作原理
Lombok 通过在编译期修改抽象语法树(AST),为类生成必要的代码,如 Getter、Setter、构造函数等。这意味着:
- Lombok 并不会在源码中显式地生成方法,而是在编译后的字节码中添加。
- IDE 需要安装 Lombok 插件才能在编辑器中正确解析 Lombok 注解,否则可能会报错或无法自动完成。
三、EasyExcel 的反射机制
EasyExcel 在读取和写入 Excel 文件时,依赖 Java 的反射机制来:
- 根据属性的 Getter 和 Setter 方法进行赋值和取值。
- 要求方法命名符合 JavaBean 规范,如
getXxx()
、setXxx()
。
如果反射机制无法正确找到或访问这些方法,就会导致数据无法正确解析或写入。
四、问题原因分析
-
Lombok 生成的方法在运行时不可见
- 如果 Lombok 未正确配置,编译器可能不会生成预期的 Getter 和 Setter 方法。
- 运行时反射无法找到对应的方法,导致属性赋值失败。
-
方法可见性或命名不符合规范
- Lombok 生成的方法可能由于配置不当,导致访问权限不是
public
。 - 方法命名不符合 JavaBean 规范,反射无法识别。
- Lombok 生成的方法可能由于配置不当,导致访问权限不是
-
IDE 或构建工具未正确配置 Lombok
- 缺少 Lombok 插件,导致编译器或编辑器无法正确处理 Lombok 注解。
- 构建工具(如 Maven、Gradle)中未正确添加 Lombok 依赖。
-
使用了 Lombok 的特定特性
- 使用了 Lombok 的
@Accessors
、@Builder
等注解,更改了方法的生成方式或命名,影响反射访问。
- 使用了 Lombok 的
五、解决方案和建议
1. 手动编写 Getter 和 Setter 方法
建议:对于需要被反射访问的属性,手动编写标准的 Getter 和 Setter 方法。
public class ProductRankImportExcelVO {private BigDecimal grossProfit;public BigDecimal getGrossProfit() {return grossProfit;}public void setGrossProfit(BigDecimal grossProfit) {this.grossProfit = grossProfit;}// 其他属性...
}
优点:
- 确保方法的可见性和命名符合 JavaBean 规范。
- 避免 Lombok 可能带来的编译或运行时问题。
2. 确保 Lombok 正确配置
-
安装 IDE 插件:确保在使用的 IDE(如 IntelliJ IDEA、Eclipse)中安装了 Lombok 插件。
-
构建工具依赖:在 Maven 或 Gradle 配置中正确添加 Lombok 依赖。
<!-- Maven 依赖示例 --> <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><scope>provided</scope> </dependency>
3. 使用 Delombok 检查生成代码
Delombok 是 Lombok 提供的工具,可以展开 Lombok 注解,生成实际的源码。
步骤:
- 运行 Delombok:使用 Lombok 提供的命令行工具或在 IDE 中运行 Delombok。
- 检查生成代码:查看生成的 Getter、Setter 方法是否正确,命名和可见性是否符合要求。
- 调整代码:根据生成结果,调整 Lombok 注解或手动编写必要的方法。
4. 避免使用复杂的 Lombok 特性
-
谨慎使用
@Accessors
:该注解可以自定义 Getter、Setter 的生成方式,可能影响方法命名。@Accessors(fluent = true) private String name; // 会生成 name() 和 name(String name) 方法,而非 getName()、setName()
-
避免影响反射的方法生成:尽量使用基本的 Lombok 注解,如
@Getter
、@Setter
,并确保生成的方法符合规范。
5. 检查方法的可见性和命名
- 方法应为
public
访问级别。 - 符合 JavaBean 规范:方法命名应为
getXxx()
、setXxx()
,其中Xxx
为属性名,首字母大写。
6. 确保属性和方法类型一致
- 类型匹配:Setter 方法的参数类型应与属性类型一致。
- 避免方法重载:不要对 Getter、Setter 方法进行重载,防止反射机制混淆。
7. 测试和验证
- 单元测试:编写测试用例,验证属性能否正确赋值和取值。
- 调试模式:在运行时调试,查看反射调用是否成功,有无异常抛出。
六、示例演示
问题复现:
@Data // Lombok 注解
public class ProductRankImportExcelVO {private BigDecimal grossProfit;// 其他属性...
}// 读取 Excel
List<ProductRankImportExcelVO> productList = ExcelUtils.read(bytes, "产品", ProductRankImportExcelVO.class);
// 结果:productList 的 grossProfit 属性全为 null
解决方案:
public class ProductRankImportExcelVO {private BigDecimal grossProfit;public BigDecimal getGrossProfit() {return grossProfit;}public void setGrossProfit(BigDecimal grossProfit) {this.grossProfit = grossProfit;}// 其他属性...
}// 重新读取 Excel
List<ProductRankImportExcelVO> productList = ExcelUtils.read(bytes, "产品", ProductRankImportExcelVO.class);
// 结果:grossProfit 属性成功赋值
七、总结
在使用 Lombok 与 EasyExcel 等依赖反射机制的库时,需要注意:
- 手动编写关键属性的 Getter 和 Setter 方法,确保方法可被反射访问。
- 正确配置 Lombok,包括 IDE 插件和构建工具依赖,确保方法正确生成。
- 遵循 JavaBean 规范,方法命名和可见性应符合要求。
- 谨慎使用 Lombok 的高级特性,避免更改方法的生成方式或命名。
通过上述措施,可以有效解决 Lombok 与 EasyExcel 的兼容性问题,确保数据解析和处理的正确性。
八、建议
- 权衡 Lombok 的使用:虽然 Lombok 可以减少样板代码,但在关键场景下,手动编写代码可以提高可靠性和可读性。
- 统一团队规范:在团队中制定 Lombok 的使用规范,明确在哪些情况下可以使用 Lombok,哪些情况下应手动编码。
- 持续学习和关注:保持对 Lombok 和 EasyExcel 等库的更新和社区讨论的关注,及时了解可能的兼容性问题和解决方案。
希望本文能帮助您深入理解 Lombok 与 EasyExcel 的兼容性问题,并在实际开发中加以注意,避免类似问题的发生。如有任何疑问,欢迎交流讨论!
相关文章:
Lombok 与 EasyExcel 兼容性问题解析及建议
在 Java 开发中,Lombok 被广泛用于减少样板代码,如 Getter、Setter、构造函数等。然而,在与像 EasyExcel 这样依赖反射机制的库一起使用时,可能会遇到一些意想不到的问题。本文将深入探讨 Lombok 与 EasyExcel 之间的兼容性问题&a…...

Kubeadm快速安装 Kubernetes集群
1. Kubernetes简介 Kubernetes(k8s)是谷歌开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它具有以下特点: 开源容器化自动部署扩展高可用 2. Kubernetes架构 Kubernetes遵循主从式架构设计,主要分…...
OpenJudge | 八皇后问题
总时间限制: 10000ms 内存限制: 65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。 输入 无输入。 输出 按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。 样例输入 (null)样例输出 No. 1 …...
C#往压缩包Zip文件的文件追加数据
C#往压缩包Zip文件的文件追加数据 往一个已经压缩好的压缩包里追加数据,一般就有两种方式,一种是前面已经学习过的,就是追加一个新的文件, 另外一种就是往已经存在的文件追加数据。 往已经存在的文件追加数据,需要先找到文件索引。 在压缩包里声明的名称,与外面的文件路…...
局域网共享文件夹:您没有权限访问,请与网络管理员联系
局域网共享文件夹:您没有权限访问,请与网络管理员联系 win10 1909 专业版背景 我有两个电脑,还有两块外挂硬盘,较大的一块放在老电脑上,为了方便用垃圾百度网盘在里边下载东西,又不污染新电脑的环境。 如…...

科技修复记忆:轻松几步,旧照变清晰
在时间的长河中,旧照片承载着无数珍贵的记忆与故事。然而,随着岁月的流逝,这些照片往往变得模糊不清,色彩黯淡,令人惋惜。 幸运的是,随着科技的发展,我们有了多种方法来修复这些旧照片的画质&a…...

java -versionbash:/usr/lib/jvm/jdk1.8.0_162/bin/java:无法执行二进制文件:可执行文件格式错误
实验环境:Apple M1在VMwareFusion使用Utubun Jdk文件错误  尝试: 1、重新在网盘下载java1.8 2、在终端通过命令下载 3、确保 JDK 正确安装在系统中,可以通过 echo $JAVA_HOME 检查 JAVA_HOME 环境变量是否设置正确。 ࿿…...

大数据-141 - ClickHouse 集群 副本和分片 Zk 的配置 Replicated MergeTree原理详解
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

Django-cookie和session
文章目录 前言CookieSession 一、Django 中 Cookie二、Django 中 Session三.区别 前言 Cookie Cookie 是由服务器发送到用户浏览器的小文件,用于存储用户的相关信息。每次用户访问网站时,浏览器会将这些 cookie 发送回服务器 特点: 1. 数据存储在客户…...
前端进阶,使用Node.js做中间层,实现接口转发和服务器渲染
在Web开发中,Node.js经常被用作中间层(也称为后端或服务器端),用于处理各种任务,包括接口转发(API Gateway)、服务器渲染(Server-Side Rendering, SSR)等。下面我将分别解…...

iPhone 16系列:熟悉的味道,全新的体验
来看看iPhone 16和Plus这两个新成员,实话说,它们和之前曝光的样子几乎完全一致。下面我们就一起来细数一下这次的几大变化吧。 外观设计:焕然一新 首先,最显眼的变化就是后置镜头模组的布局调整为了垂直排列。这一改变使得整个背…...
改进拖放PDF转换为图片在转换为TXT文件的程序
前段时间我写了Python识别拖放的PDF文件再转成文本文件-CSDN博客 最近有2点更新,一是有一些pdf文件转换出来的图片是横的,这样也可以识别文字,但是可能会影响效果,另一个是发现有一些文字识别不出来,看了关于提高Padd…...
在 Flutter 开发中如何选择状态管理:Provider 和 GetX 比较
在 Flutter 开发中,状态管理是一个至关重要的部分。正确的状态管理方案能够提高应用的可维护性和可扩展性。在众多状态管理方案中,Provider 和 GetX 是两种非常流行的选择。本文将对这两者进行比较,并提供代码示例,以帮助开发者选…...

python中ocr图片文字识别样例(二)
一、说明 本次解决图片相关出现中文乱码问题,属于上篇文章的优化,前提条件依赖上篇文章的包,当然ocr的具体应用场景很多,根据自身需求进行调整 二、具体实现 2.1 代码实现: # -*- coding: utf-8 -*- import easyoc…...

2024 新手指南:轻松掌握 Win10 的录屏操作
之前为了节约成本我们公司都采用录制软件操作都方式来为异地的同事进行远程操作培训的。所以我们尝试了不少的录屏工具,这里我就分享下win10怎么录屏的操作过程。 1.福昕录屏大师 链接:www.foxitsoftware.cn/REC/ 这款录屏工具是初学者的理想之选&…...

无人机黑飞打击技术详解
随着无人机技术的普及,无人机“黑飞”(未经授权或违反规定的飞行)现象日益严重,对公共安全、隐私保护及重要设施安全构成了严重威胁。为有效应对这一挑战,各国政府和安全机构纷纷研发并部署了一系列无人机黑飞打击技术…...
GoFly快速开发框架/Go语言封装的图像相似性比较插件使用说明
说明 图像相似性搜索应用广泛、除了使用搜索引擎搜索类似图片外,像淘宝可以让顾客直接拍照搜索类似的商品信息、应用在商品购物上,也可以应用物体识别比如拍图识花等领域。还有在调研图片鉴权的方案,通过一张图片和图片库中的图片进行比对&a…...
【牛客】小白赛101-B--tb的字符串问题
题目传送门 思路:括号匹配板子 反思:我用了模拟打标记的方式但是还是wa了 ac代码 用了栈维护 当栈里面个数到达1个以上的时候就可以判断栈顶是否匹配然后重复出入栈操作 #include<bits/stdc.h> using namespace std; const int N1e63; string…...

企业专用智能云盘 | 帮助企业便捷管控企业文档 | 天锐绿盘云文档安全管理系统
由于当前多数企业内部的办公文件普遍散落于各员工电脑中,导致存在诸多潜在的文档使用风险。为优化团队协作效率,天 锐 绿盘是一款集文档统一管理、高效协同于一体的企业云盘,帮助企业解决文档管理中的诸多难题。 【地址:点击了解天…...
软件工程专业未来发展方向
1. 前端开发(Front-end Development) 简介: 前端开发者专注于网站和应用程序的用户界面和用户体验设计。他们使用HTML、CSS、JavaScript等基本技术,以及React、Angular、Vue.js等前端框架,来创建互动性强、响应迅速的…...
金融欺诈有哪些检测手段
金融欺诈检测是一个多层次的动态防御过程,需要结合技术手段、数据分析、人工智能和人工审核。以下是当前主流的检测手段和技术分类。 ### **一、核心技术手段** 1. **规则引擎(Rule-Based Systems)** - **原理**:预设基于历史…...

2025年电气工程与轨道交通国际会议:绿色能源与智能交通的创新之路
2025年电气工程与轨道交通国际会议(ICEERT 2025)是一场电气工程与轨道交通领域的国际盛会,将于2025年在武汉隆重召开。此次会议汇聚了全球顶尖的专家学者和行业精英,共同探讨电气工程与轨道交通的最新研究成果和技术趋势。会议将围…...
Web3怎么开发类似MetaMask的钱包
开发一个类似MetaMask的钱包,关键就是要利用以太坊提供的官方接口和标准,主要涉及以下几点: 1. 你要用到的以太坊官方接口和规范 JSON-RPC API 以太坊节点(如Geth、OpenEthereum等)通过JSON-RPC接口暴露各种功能&…...
mac电脑安装nvm
方案一、常规安装 下载安装脚本:在终端中执行以下命令来下载并运行 NVM 的安装脚本3: bash curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash配置环境变量:安装完成后,需要配置环境变量。如…...

ES分词搜索
ES的使用 前言作者使用的版本作者需求 简介ES简略介绍ik分词器简介 使用es的直接简单使用es的查询 es在java中使用备注说明 前言 作者使用的版本 es: 7.17.27spring-boot-starter-data-elasticsearch: 7.14.2 作者需求 作者接到一个业务需求,我们系统有份数据被…...

⭐ Unity AVProVideo插件自带播放器 脚本重构 实现视频激活重置功能
一、功能概述 本笔记记录直接修改插件自带的场景播放其中 原始的 MediaPlayerUI 脚本,实现激活时自动重置播放器的功能。 我用的插件版本是 AVPro Video - Ultra Edition 2.7.3 修改后的脚本将具备以下特性: 激活 GameObject 时自动重置播放位置到开头 可配置是否在重置后自…...
Rust 学习笔记:使用迭代器改进 minigrep
Rust 学习笔记:使用迭代器改进 minigrep Rust 学习笔记:使用迭代器改进 minigrep不使用 clone,而使用迭代器使用迭代器适配器使代码更清晰在循环或迭代器之间进行选择 Rust 学习笔记:使用迭代器改进 minigrep 前情提要࿱…...

ChatGPT Plus/Pro 订阅教程(支持支付宝)
订阅 ChatGPT Plus GPT-4 最简单,成功率最高的方案 1. 登录 chat.openai.com 依次点击 Login ,输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后,点击左下角的 Upgrade to Plus,在弹窗中选择 Upgrade plan。 如果…...
缓存架构方案:Caffeine + Redis 双层缓存架构深度解析
在高并发、低延迟的现代互联网系统中,缓存是提升系统性能和稳定性的重要手段。随着业务复杂度的增长,单一缓存方案(如仅使用Redis或仅使用本地缓存)已难以满足高性能与一致性需求。 本文将围绕 Caffeine Redis 的双层缓存架构展…...

java基础(面向对象进阶高级)内部类
内部类 内部类概述、成员内部类 (了解) 内部类创建对象: 一定要继承外部类对象,才能创建内部类对象。 拓展:成员内部类访问外部类的成员特点: 成员内部类中,是否可以直接访问外部类的实例成员?? 当然可以啊&#x…...