排查使用EasyPoi的示例分析
本篇文章给大家分享的是有关排查使用EasyPoi的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
排查使用EasyPoi:
//这个是调用indexScoreMonitoringService的一个方法返回DTO,这个DTO就是封装了需要导出excel的数据ListscoreCollinearityParentClassDTOS = indexScoreMonitoringService.scoreCollinearity(ratingModelReportQuery, indexScoreIdsList, 1);//调用公司统一封装的EasyPoiUtil工具类下载excel文件EasyPoiUtil.exportExcel(scoreCollinearityParentClassDTOS, null, EasyPoiUtil.CHART_NAME[cid], ScoreCollinearityExcelDTO.class, EasyPoiUtil.CHART_NAME[cid] + ".xls", response);
下面贴一下该工具类中exportExcel方法的相关描述
/** * 功能描述:复杂导出Excel,包括文件名以及表名,不创建表头 * * @author yan * @date 2019/8/5 14:11 * @param list 导出的实体类 * @param title 表头名称 * @param sheetName sheet表名 * @param pojoClass 映射的实体类 * @param fileName * @param response * @return */
下面在贴一下ScoreCollinearityParentClassDTO的相关代码
private static final long serialVersionUID = 4575184647737532340L;@Excel(name = "共线性", width = 40 ,orderNum="4")public String collinearity;//......省略下面其他生成set与get的代码//......
另外我同事说,他在构造DTO的时候其实是用的ScoreCollinearityParentClassDTO的一个子类ScoreCollinearityExcelDTO,所以我把ScoreCollinearityExcelDTO也贴一下。具体封装DTO就不贴了。下面是有关ScoreCollinearityExcelDTO的相关代码
@Excel(name = "日期", width = 40)private String month;@Excel(name = "模型名称", width = 40)private String modelName;@Excel(name = "模块名A~指标名A --- 模块名B~指标名B", width = 40)private String ModuleNameIndexName;//......省略下面其他生成set与get的代码//......
这里再记录一点,同事事先排查问题的时候,发现导出只有父类的一列值,所以他本地修改了代码,用返回子类集合,然后报空指针异常。所以为了与他本地代码保持一致,我现在我本地修改一下代码。具体修改后的代码我就不贴出来了。就是修改封装DTO的Service返回子类集合,然后用子类集合进行接受。
2.解决问题
上面进行了问题的相关描述。由于代码不多,我先通过肉眼检查一下代码什么地方不对。最后发现ScoreCollinearityExcelDTO中的一个属性定义很不符合规范
首字母写成了大写。也许是同事在什么地方拷贝过来的,忘记修改了。我先将这个地方改成小写。然后自测一下,发现问题得到了解决。哈哈。感觉好顺利哦。于是我让同事把这个地方改了,提交代码,先把问题解决,不要卡在这儿。
3.跟踪源码,分析原因
问题是解决了。但是为什么呢?我们不能胡乱一懵,将问题解决,就不管了啊。就算当时上班比较忙,也要备注下。事后也要对问题进行分析,找出问题根本问题所在。知道为什么。所以开始我我查看easypoi源码的历程。
我现在我本地将代码还原。然后调试将异常信息打印出来。发现也不是空指针问题啊,尴尬了。
而且报错也很也很详细,将字段名都描述出来了。难不成我这边跟他那边不一样。
很明显,这个获取method没有获取到,为null了。我们这这里打一个断点,进行调试。发现的确为null
查看getMethods
返回的是一个map,key为moduleNameIndexName,但传入的是ModuleNameIndexName,当然找不到咯。那么下面我们来看看,这个getMethods是怎么封装的。下面是我一直往上找的相关源码,重点我都标记出来了。
easypoi底层是通过过去所有的get方法进行封装到Map集合的,key为去掉方法名,去掉get后将首字母小写作为key。所以 getModuleNameIndexName ----> moduleNameIndexName
而获取的时候是通过属性名获取的,这里不管是moduleNameIndexName或ModuleNameIndexName,生成后的get方法相同。所以导致了不对应的问题。
以上就是排查使用EasyPoi的示例分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。