一、問題由來
新項目的開發中,打包方式由war包改為了jar包的方式,這樣在部署的時候更加的方便。測試環境使用pm2這個工具來管理項目的運行,停止,重啟等等非常方便。
可是當測試人員在測試項目中的文件下載時,就報了一個奇怪的錯誤,class path resource xxxxxx cannot be resolved to URL because it does not exist。大意就是說
某個路徑下的資源文件不存在,下載的是模板excel文件,項目中就直接把它放在resources路徑下,在該路徑下又創建了一個目錄用於統一存放模板。測試人員提BUG
后,我們開發就得想辦法解決,一步一步排查問題,分析問題,解決問題。
二、問題分析
首先確定一點,將項目打成war包時都是好好的,可以正常下載。現在打成jar包進行發布,怎么突然就不行了呢?於是我找到該段代碼進行分析,如下:
最開始寫文件下載那個人,是使用一個統一的方法進行下載,首先將需要下載的模板文件信息統一配置在配置文件當中。
使用一個配置類統一的進行讀取,頁面中需要下載什么模板時,只需要傳入對應的類型即可,這樣操作很方便,並且可以動態配置。可是在讀取的時候處理
方式有些特別,首先是通過類 ClassPathResource 類進行讀取,然后將讀取到的內容轉換為一個File文件,在將這個文件轉換為字節數組,響應給前端。看到
這里時我認為這種操作有些多余,並且在看了好幾篇博客后,嘗試着進行更改代碼。
三、解決方案
改動的方式為讀取文件的方式還是一樣,只是不在做復雜的轉換,讀取到文件內容后,直接獲取其輸入流,然后將輸入流轉換為字節流即可。
InputStream is = resource.getInputStream();
byte[] outBytes = IOUtils.toByteArray(is);
只改動這兩句,修改完后重寫打包測試,問題解決。由此可以判斷,問題就出在將獲取的文件內容轉換為文件,然后在將文件轉換為字節數組這步操作。
參考文章一
https://www.jianshu.com/p/7d7e5e4e8ae3
參看文章二
https://www.cnblogs.com/suizhikuo/p/13413738.html
參考文章三
https://blog.csdn.net/qq_34896199/article/details/107082991