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()

如果反射机制无法正确找到或访问这些方法,就会导致数据无法正确解析或写入。

四、问题原因分析

  1. Lombok 生成的方法在运行时不可见

    • 如果 Lombok 未正确配置,编译器可能不会生成预期的 Getter 和 Setter 方法。
    • 运行时反射无法找到对应的方法,导致属性赋值失败。
  2. 方法可见性或命名不符合规范

    • Lombok 生成的方法可能由于配置不当,导致访问权限不是 public
    • 方法命名不符合 JavaBean 规范,反射无法识别。
  3. IDE 或构建工具未正确配置 Lombok

    • 缺少 Lombok 插件,导致编译器或编辑器无法正确处理 Lombok 注解。
    • 构建工具(如 Maven、Gradle)中未正确添加 Lombok 依赖。
  4. 使用了 Lombok 的特定特性

    • 使用了 Lombok 的 @Accessors@Builder 等注解,更改了方法的生成方式或命名,影响反射访问。

五、解决方案和建议

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 注解,生成实际的源码。

步骤

  1. 运行 Delombok:使用 Lombok 提供的命令行工具或在 IDE 中运行 Delombok。
  2. 检查生成代码:查看生成的 Getter、Setter 方法是否正确,命名和可见性是否符合要求。
  3. 调整代码:根据生成结果,调整 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 的兼容性问题,并在实际开发中加以注意,避免类似问题的发生。如有任何疑问,欢迎交流讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/428212.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode118:杨辉三角

题目链接&#xff1a;118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 代码如下 class Solution {public:vector<vector<int>> generate(int numRows) {vector<vector<int>> dp(numRows);vector<int> temp(numRows);for (int i 0; i &…

【PyTorch】autograd与逻辑回归

autograd – 自动求导系统 torch.autograd autograd torch.autograd.backward 功能&#xff1a;自动求取梯度 tensor&#xff1a;用于求导的张量&#xff0c;如lossretain_graph&#xff1a;保存计算图create_graph&#xff1a;创建导数计算图&#xff0c;用于高阶求导gra…

【计算机网络】TCP 协议——详解三次握手与四次挥手

文章目录 一、引言二、TCP1、TCP 的数据格式2、TCP 的三次握手3、TCP 的四次挥手4、TCP 的全双工通信 三、TCP 的状态转换1、TCP 连接的建立&#xff08;三次握手&#xff09;状态2、TCP 连接的终止&#xff08;四次挥手&#xff09;状态3、TCP 异常情况 一、引言 TCP与UDP的区…

外观模式详解:如何为复杂系统构建简洁的接口

&#x1f3af; 设计模式专栏&#xff0c;持续更新中 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 外观模式 外观模式&#xff08;Facade Pattern&#xff09;为子系统中的一组…

基于协同过滤算法+PHP的新闻推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤算法PHPMySQL的新…

Liveweb视频汇聚平台支持GB28181转RTMP、HLS、RTSP、FLV格式播放方案

GB28181协议凭借其在安防流媒体行业独有的大统一地位&#xff0c;目前已经在各种安防项目上使用。雪亮工程、幼儿园监控、智慧工地、物流监控等等项目上目前都需要接入安防摄像头或平台进行直播、回放。而GB28181协议作为国家推荐标准&#xff0c;目前基本所有厂家的安防摄像头…

【可变模板参数】

文章目录 可变参数模板的概念可变参数模板的定义方式参数包的展开方式递归展开参数包逗号表达式展开参数包 STL容器中的emplace相关接口函数 可变参数模板的概念 可变参数模板是C11新增的最强大的特性之一&#xff0c;它对参数高度泛化&#xff0c;能够让我们创建可以接受可变…

VM虚拟机使用的镜像文件下载

文章目录 Windows系统进入微软官网下载工具以Windows10为例下载镜像文件 Windows系统 进入微软官网下载工具 微软中国官网&#xff1a;https://www.microsoft.com/zh-cn/ 以Windows10为例下载镜像文件 选择下载的路径 开始下载 安装windows10操作系统出现Time out问题及解决办…

【已解决】华为AR100-S路由器 恢复出厂后,找不到5G wifi的设置

前两帖讨论了华为AR100-S路由器&#xff1a; 一是用电脑浏览器访问web管理界面报错的解决&#xff0c;详情点这里&#xff01; https://blog.csdn.net/weixin_62598385/article/details/142215136 再就是如何回复出厂&#xff0c;也即如何复位&#xff0c; 详情点这里&#xff…

简明linux系统编程--互斥锁--TCP--UDP初识

目录 1.互斥锁 2.信号 2.1介绍 2.2信号的内核机制 3.linux网络编程概述 3.1一览七层协议 3.2一览数据传输过程 3.3四层网络模型 3.4服务端和客户端的数据交互 4.TCP服务端编程 5.TCP客户端编程 6.UDP服务端编程 7.UDP客户端编程 1.互斥锁 互斥锁也是和信号量一样&a…

自动化测试常用函数

目录 一、元素的定位 1、cssSelector 2、xpath &#xff08;1&#xff09;xpath 语法 1、获取HTML页面所有的节点 2、获取HTML页面指定的节点 3、获取一个节点中的直接子节点 4、获取一个节点的父节点 5、实现节点属性的匹配 6、使用指定索引的方式获取对应的节点内容…

鸿蒙OpenHarmony【轻量系统内核通信机制(消息队列)】子系统开发

消息队列 基本概念 消息队列又称队列&#xff0c;是一种任务间通信的机制。消息队列接收来自任务或中断的不固定长度消息&#xff0c;并根据不同的接口确定传递的消息是否存放在队列空间中。 任务能够从队列里面读取消息&#xff0c;当队列中的消息为空时&#xff0c;挂起读…

Linux--禁止root用户通过ssh直接登录

原文网址&#xff1a;Linux--禁止root用户通过ssh直接登录_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Linux服务器怎样禁止root用户通过ssh直接登录。 为什么要禁止&#xff1f; 因为root用户是每个Linux系统都有的&#xff0c;黑客可以使用root用户名尝试不同的密码来暴力破…

ClickHouse 与 Quickwit 集成实现高效查询

1. 概述 在当今大数据分析领域&#xff0c;ClickHouse 作为一款高性能的列式数据库&#xff0c;以其出色的查询速度和对大规模数据的处理能力&#xff0c;广泛应用于在线分析处理 (OLAP) 场景。ClickHouse 的列式存储和并行计算能力使得它在处理结构化数据查询时极具优势&…

【Elasticsearch】-spring boot 依赖包冲突问题

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.17.24</version></dependency> 在pom的配置中&#xff0c;只引入了elasticsearch-7.17.24 &#xff0c;但实际上会同时…

seq2seq翻译实战-Pytorch复现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 code from __future__ import unicode_literals, print_function, division from io import open import unicodedata import string import re import rando…

半导体器件制造5G智能工厂数字孪生物联平台,推进制造业数字化转型

半导体器件制造行业作为高科技领域的核心驱动力&#xff0c;正积极探索和实践以5G智能工厂数字孪生平台为核心的新型制造模式。这一创新不仅极大地提升了生产效率与质量&#xff0c;更为制造业的未来发展绘制了一幅智能化、网络化的宏伟蓝图。 在半导体器件制造5G智能工厂中&a…

RabbitMQ 高级特性——发送方确认

文章目录 前言发送方确认confirm 确认模式return 退回模式 常见面试题 前言 前面我们学习了 RabbitMQ 中交换机、队列和消息的持久化&#xff0c;这样能够保证存储在 RabbitMQ Broker 中的交换机和队列中的消息实现持久化&#xff0c;就算 RabbitMQ 服务发生了重启或者是宕机&…

中间件知识点-消息中间件(Rabbitmq)一

消息中间件介绍 MQ的作用(优点)主要有以下三个方面&#xff1a; a.异步 b.解耦 c.削峰 MQ的作用(缺点)主要有以下三个方面&#xff1a; a.系统可用性降低 b.系统复杂度提高 c.存在消息一致性问题需要解决 备注&#xff1a; 引入MQ后系统的复杂度会大大提高。 以前服务之间可以…

【软件基础知识】什么是 API,详细解读

想象一下,你正在使用智能手机上的天气应用。你打开应用,瞬间就能看到实时天气、未来预报,甚至是空气质量指数。但你有没有想过,这些数据是如何神奇地出现在你的屏幕上的?答案就在三个字母中:API。 API,全称Application Programming Interface(应用程序编程接口),是现代软件世…