SpringBoot打jar包-下载文件时报错-class path resource xxxxxx cannot be resolved to URL because it does not exist
一、问题由来
新项目的开发中,打包方式由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