您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關排查使用EasyPoi的示例分析,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
排查使用EasyPoi:
//這個是調用indexScoreMonitoringService的一個方法返回DTO,這個DTO就是封裝了需要導出excel的數據 List<ScoreCollinearityParentClassDTO> scoreCollinearityParentClassDTOS = 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返回子類集合,然后用子類集合進行接受。
上面進行了問題的相關描述。由于代碼不多,我先通過肉眼檢查一下代碼什么地方不對。最后發現ScoreCollinearityExcelDTO中的一個屬性定義很不符合規范
首字母寫成了大寫。也許是同事在什么地方拷貝過來的,忘記修改了。我先將這個地方改成小寫。然后自測一下,發現問題得到了解決。哈哈。感覺好順利哦。于是我讓同事把這個地方改了,提交代碼,先把問題解決,不要卡在這兒。
問題是解決了。但是為什么呢?我們不能胡亂一懵,將問題解決,就不管了啊。就算當時上班比較忙,也要備注下。事后也要對問題進行分析,找出問題根本問題所在。知道為什么。所以開始我我查看easypoi源碼的歷程。
我現在我本地將代碼還原。然后調試將異常信息打印出來。發現也不是空指針問題啊,尷尬了。
而且報錯也很也很詳細,將字段名都描述出來了。難不成我這邊跟他那邊不一樣。
很明顯,這個獲取method沒有獲取到,為null了。我們這這里打一個斷點,進行調試。發現的確為null
查看getMethods
返回的是一個map,key為moduleNameIndexName,但傳入的是ModuleNameIndexName,當然找不到咯。那么下面我們來看看,這個getMethods是怎么封裝的。下面是我一直往上找的相關源碼,重點我都標記出來了。
easypoi底層是通過過去所有的get方法進行封裝到Map集合的,key為去掉方法名,去掉get后將首字母小寫作為key。所以 getModuleNameIndexName ----> moduleNameIndexName
而獲取的時候是通過屬性名獲取的,這里不管是moduleNameIndexName或ModuleNameIndexName,生成后的get方法相同。所以導致了不對應的問題。
以上就是排查使用EasyPoi的示例分析,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。