accessors 作用_EasyExcel与@Accessors(chain = true)不兼容分析

accessors 作用_EasyExcel与@Accessors(chain = true)不兼容分析EasyExcelEasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel.github地址:https://github.com/alibaba/easyexcelAccessors@Accessors注解用来配置lombok如何产生和显示getters和setters的方法。public@interfaceAcce…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

EasyExcel

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel. github地址: https://github.com/alibaba/easyexcel

Accessors

@Accessors 注解用来配置lombok如何产生和显示getters和setters的方法。

public @interface Accessors { /**

* 如果为true,则访问器将以该字段命名,并且不包含 get 或 set *前缀,且省略了chain,则 chain 默认为true。

* *默认值:false

*/ boolean fluent() default false; /**

* *如果为true,setter将返回this而不是void。

* *默认:false

*/ boolean chain() default false; String[] prefix() default {}; }

测试案例

pom.xml

org.projectlomboklomboktruecom.alibabaeasyexcel2.2.6

Student.java

@Data @Accessors(chain = true) public class Student { @ExcelProperty(“编码”) private Long id; @ExcelProperty(“姓名”) private String name; @ExcelProperty(“性别”) private String sex; @ExcelProperty(“年龄”) private Integer age; }

StudentControllerTest.java

public class StudentControllerTest { /**

* 导出Excel上传模板

*/ @Test public void importTemplate() { String filePath = “D:/student.xlsx”; EasyExcel.write(filePath, Student.class).sheet(“student”).doWrite(null); } /**

* 导入Excel数据

*/ @Test public void importExcel() { String filePath = “D:/student.xlsx”; List list = EasyExcel.read(filePath, Student.class, null).sheet(“student”).doReadSync(); for (Object obj : list) { System.out.println(obj.toString()); } } }

student.xlsx 数据

accessors 作用_EasyExcel与@Accessors(chain = true)不兼容分析

执行 importExcel 导入Excel 结果: 可以看到, 导入数据条数能解析, 但数据没有读取成功

accessors 作用_EasyExcel与@Accessors(chain = true)不兼容分析

原因详解

通过删减无关代码的方法, 发现当删减 @Accessors(chain = true)或修改为 @Accessors(chain = false)后, 能够正常读取到了, 定位到是该注解的影响, 为什么会影响呢? 带着这个疑问我们继续往下看

EasyExcel 解析Excel 过程

ModelBuildEventListener

private Object buildUserModel(Map cellDataMap, ReadHolder currentReadHolder, AnalysisContext context) { ExcelReadHeadProperty excelReadHeadProperty = currentReadHolder.excelReadHeadProperty(); Object resultModel; try { resultModel = excelReadHeadProperty.getHeadClazz().newInstance(); } catch (Exception e) { throw new ExcelDataConvertException(context.readRowHolder().getRowIndex(), 0, new CellData(CellDataTypeEnum.EMPTY), null, “Can not instance class: ” + excelReadHeadProperty.getHeadClazz().getName(), e); } Map headMap = excelReadHeadProperty.getHeadMap(); Map map = new HashMap(headMap.size() * 4 / 3 + 1); Map contentPropertyMap = excelReadHeadProperty.getContentPropertyMap(); for (Map.Entry entry : headMap.entrySet()) { Integer index = entry.getKey(); if (!cellDataMap.containsKey(index)) { continue; } CellData cellData = cellDataMap.get(index); if (cellData.getType() == CellDataTypeEnum.EMPTY) { continue; } ExcelContentProperty excelContentProperty = contentPropertyMap.get(index); Object value = ConverterUtils.convertToJavaObject(cellData, excelContentProperty.getField(), excelContentProperty, currentReadHolder.converterMap(), currentReadHolder.globalConfiguration(), context.readRowHolder().getRowIndex(), index); if (value != null) { map.put(excelContentProperty.getField().getName(), value); } } BeanMap.create(resultModel).putAll(map); return resultModel; }

当Excel每行数据解析后, 会调用 buildStringList 将解析到的数据由Map转存到Bean中, 关键代码如下:

BeanMap.create(resultModel).putAll(map);

可见, EasyExcel是使用 net.sf.cglib.beans.BeanMap 工具类拷贝的, 这正是造成 使用@Accessors(chain = true)后, EasyExcel解析不到数据的原因所在.

为什么使用了@Accessors(chain = true)后, BeanMap会拷贝不成功呢?

@Accessors(chain = true) 的作用

使set方法返回的不是void, 而是当前对象, 例如:

// 不加 @Accessors(chain = true) 时 @Data public class Student { private String name; } // 相当于 public class Student { private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } } // 加了 @Accessors(chain = true) 时 @Data @Accessors(chain = true) public class Student { private String name; } // 相当于, 添加的好处: 可以支持 new Student().setName(“zhang”).setXXX(“xxx”).setXXXX(“XXX”)这样的操作 public class Student { private String name; public String getName() { return this.name; } public Student setName(String name) { this.name = name; return this; } }

BeanMap 从Map拷贝到Bean的测试

参考: 使用CGlib实现Bean拷贝(BeanCopier)

可见, 需要使用BeanMap从Map拷贝到Bean, 需要Map 的Key与Bean的变量名一致, 并有对应的 set方法, 且set方法为 void, 才能拷贝成功

已经找到了原因, 如何解决呢? 到GitHub里看了看, 作者表示现在还没法解决, 小编只能暂时不用 @Accessors(chain = true), 还是提醒广大网友, 在使用MybatisPlus生成代码时,一定要注意是否带有@Accessors(chain = true)注解,如果带有,会影响EasyExcel读取数据哦

accessors 作用_EasyExcel与@Accessors(chain = true)不兼容分析

本文地址:https://blog.csdn.net/qq_28036249/article/details/108035369

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230858.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C语言:判断回文字符串的两种简单方法

    C语言:判断回文字符串的两种简单方法我的机器学习教程「美团」算法工程师带你入门机器学习已经开始更新了,欢迎大家订阅~任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~之前写…

    2022年6月6日
    19
  • 程序员需要什么条件_大厂程序员啥意思

    程序员需要什么条件_大厂程序员啥意思从参加工作到现在,短短的几年内,我投资在自己身上的钱已超过三十多万,光买书籍的钱就已超过总投资的三分之一,买了不少于上千本书,有实体书,也有电子书。这些书不仅提升了我的技术能力,更提升了我的视野和认知。

    2022年8月22日
    5
  • 专门下载激活成功教程软件的网站_激活成功教程软件下载网址

    专门下载激活成功教程软件的网站_激活成功教程软件下载网址今天想给大家推荐一些免费下载激活成功教程软件的网站,希望能帮助到大家!第一个要推荐的就CSDN自己的下载资源网站:https://download.csdn.net/推荐的原因主要是资源够全,一般网上有的这里都有,而且下载的时候能看到其他下载者的真实评价,但是有点不好的就是对新人不太友好,虽然有很多免积分的,但是一些新的资源都需要积分,不过人人为我,我为人人,在这里赚扣分也是很简单的事,只要你能上…

    2022年10月12日
    0
  • 用于重新编译的工具和命令

    用于重新编译的工具和命令

    2021年11月25日
    38
  • JAVA课程设计——飞机大战(个人)

    JAVA课程设计——飞机大战(个人)

    2021年10月6日
    58
  • java笔试题库及答案,看完必懂

    java笔试题库及答案,看完必懂阿里面试总结1.一面首先确认对阿里的意向度;其次面试官会针对你曾经做过的项目来做具体技术的交流,你对项目细节是不是掌握到位,以及java技术基础和原理掌握程序,比如并发编程以及数据库和JVM三个方面,也会交流到分布式、线程池的实现等等(重点考察有没有深入钻研技术和技术上的亮点);2.二面技术面,根据项目深入的了解技术实力,了解你的知识面、问题解决能力以及技术灵活运用能力,也通过这一过程考察团队合作能力、学习主动性和创新性,可以挑选2-3个做过的有典型性的项目做一个仔细技术回顾和自己独到的理解(这是加

    2022年7月8日
    22

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号