注解@Accessors(chain = true)导致导入失败

实体类使用注解@Accessors(chain = true)导致导入失败

一、问题描述:

  1. @Accessors(chain = true)是干什么的?

    当实体类增加过@Accessors(chain = true)之后, 生成的set方法会返回当前对象,这样就可以为当前对象提供链式访问的能力,简化代码。

    Student stu = new Student().setName("张三").setSex("男").setAge("29");
    
  2. 问题:

    项目中一个导入导出功能需要修改,依赖使用easyExcel,之前功能一切正常,使用的是同一个映射实体类,导入导出工具类类也是同一个,因为新需求需要频繁的手动生成实体类对象设置属性值,为了方便就在实体类头上使用了@Accessors(chain = true)。结果等功能上到开发环境测试时,却发现导出正常,导入数据怎么也解析不出来,代码反复检查了几遍,最后实在没办法把@Accessors(chain = true)注掉,手动调用set方法给对象赋值,上线一测竟然就好了!!!

二、问题解决

  1. 原因分析:

    EasyExcel是使用 net.sf.cglib.beans.BeanMap 工具类拷贝的, 该工具类的set方法为void,而@Accessors(chain = true)的set方法返回的是当前对象,这就导致EasyExcel解析不到数据。

  2. 解决方法

    直接不使用用@Accessors(chain = true)就可以了 😜