本篇文章給大家分享的是有關(guān)排查使用EasyPoi的示例分析,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
10余年的儋州網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整儋州建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“儋州網(wǎng)站設(shè)計(jì)”,“儋州網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
排查使用EasyPoi:
//這個(gè)是調(diào)用indexScoreMonitoringService的一個(gè)方法返回DTO,這個(gè)DTO就是封裝了需要導(dǎo)出excel的數(shù)據(jù) ListscoreCollinearityParentClassDTOS = indexScoreMonitoringService.scoreCollinearity(ratingModelReportQuery, indexScoreIdsList, 1); //調(diào)用公司統(tǒng)一封裝的EasyPoiUtil工具類下載excel文件 EasyPoiUtil.exportExcel(scoreCollinearityParentClassDTOS, null, EasyPoiUtil.CHART_NAME[cid], ScoreCollinearityExcelDTO.class, EasyPoiUtil.CHART_NAME[cid] + ".xls", response);
下面貼一下該工具類中exportExcel方法的相關(guān)描述
/** * 功能描述:復(fù)雜導(dǎo)出Excel,包括文件名以及表名,不創(chuàng)建表頭 * * @author yan * @date 2019/8/5 14:11 * @param list 導(dǎo)出的實(shí)體類 * @param title 表頭名稱 * @param sheetName sheet表名 * @param pojoClass 映射的實(shí)體類 * @param fileName * @param response * @return */
下面在貼一下ScoreCollinearityParentClassDTO的相關(guān)代碼
private static final long serialVersionUID = 4575184647737532340L; @Excel(name = "共線性", width = 40 ,orderNum="4") public String collinearity; //......省略下面其他生成set與get的代碼 //......
另外我同事說,他在構(gòu)造DTO的時(shí)候其實(shí)是用的ScoreCollinearityParentClassDTO的一個(gè)子類ScoreCollinearityExcelDTO,所以我把ScoreCollinearityExcelDTO也貼一下。具體封裝DTO就不貼了。下面是有關(guān)ScoreCollinearityExcelDTO的相關(guān)代碼
@Excel(name = "日期", width = 40) private String month; @Excel(name = "模型名稱", width = 40) private String modelName; @Excel(name = "模塊名A~指標(biāo)名A --- 模塊名B~指標(biāo)名B", width = 40) private String ModuleNameIndexName; //......省略下面其他生成set與get的代碼 //......
這里再記錄一點(diǎn),同事事先排查問題的時(shí)候,發(fā)現(xiàn)導(dǎo)出只有父類的一列值,所以他本地修改了代碼,用返回子類集合,然后報(bào)空指針異常。所以為了與他本地代碼保持一致,我現(xiàn)在我本地修改一下代碼。具體修改后的代碼我就不貼出來了。就是修改封裝DTO的Service返回子類集合,然后用子類集合進(jìn)行接受。
上面進(jìn)行了問題的相關(guān)描述。由于代碼不多,我先通過肉眼檢查一下代碼什么地方不對(duì)。最后發(fā)現(xiàn)ScoreCollinearityExcelDTO中的一個(gè)屬性定義很不符合規(guī)范
首字母寫成了大寫。也許是同事在什么地方拷貝過來的,忘記修改了。我先將這個(gè)地方改成小寫。然后自測(cè)一下,發(fā)現(xiàn)問題得到了解決。哈哈。感覺好順利哦。于是我讓同事把這個(gè)地方改了,提交代碼,先把問題解決,不要卡在這兒。
問題是解決了。但是為什么呢?我們不能胡亂一懵,將問題解決,就不管了啊。就算當(dāng)時(shí)上班比較忙,也要備注下。事后也要對(duì)問題進(jìn)行分析,找出問題根本問題所在。知道為什么。所以開始我我查看easypoi源碼的歷程。
我現(xiàn)在我本地將代碼還原。然后調(diào)試將異常信息打印出來。發(fā)現(xiàn)也不是空指針問題啊,尷尬了。
而且報(bào)錯(cuò)也很也很詳細(xì),將字段名都描述出來了。難不成我這邊跟他那邊不一樣。
很明顯,這個(gè)獲取method沒有獲取到,為null了。我們這這里打一個(gè)斷點(diǎn),進(jìn)行調(diào)試。發(fā)現(xiàn)的確為null
查看getMethods
返回的是一個(gè)map,key為moduleNameIndexName,但傳入的是ModuleNameIndexName,當(dāng)然找不到咯。那么下面我們來看看,這個(gè)getMethods是怎么封裝的。下面是我一直往上找的相關(guān)源碼,重點(diǎn)我都標(biāo)記出來了。
easypoi底層是通過過去所有的get方法進(jìn)行封裝到Map集合的,key為去掉方法名,去掉get后將首字母小寫作為key。所以 getModuleNameIndexName ----> moduleNameIndexName
而獲取的時(shí)候是通過屬性名獲取的,這里不管是moduleNameIndexName或ModuleNameIndexName,生成后的get方法相同。所以導(dǎo)致了不對(duì)應(yīng)的問題。
以上就是排查使用EasyPoi的示例分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。