内容简介:未打包是没问题的,打完包后就发生了错误。开始逐步定位问题。
引言
Alice
上线后,学生导入模版文件下载失败。
未打包是没问题的,打完包后就发生了错误。开始逐步定位问题。
原方法
File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "static/导入学生模板.xlsx"); InputStream inputStream = new FileInputStream(file); Workbook workbook = new XSSFWorkbook(inputStream);
经测试,问题出在 ResourceUtils.getFile
这个方法上。
ResourceUtils.CLASSPATH_URL_PREFIX + "static/导入学生模板.xlsx"
字符串拼接后就是 classpath:static/导入学生模板.xlsx
,没打包时,该方法能正常获取到该 Excel
文件。
ResourceUtils.getFile
是获取磁盘上的文件,而打完包之后, resources
目录了下的所有资源都被打进了 jar
包,所以不存在相应的 Excel
文件,获取的时候就报错了。找不到文件。
测试
将打好的 jar
包解压,主要的东西都在 BOOT-INF
里。 META-INF
里面有 pom.xml
,应该是存储项目信息的。 org
目录内是 springframework
的一些 class
字节码。
BOOT-INF
内就是本项目的核心代码与第三方库。
classes
目录下就是本项目的核心代码,我们的 Excel
就在这里面。
lib
目录下是项目中引用的第三方 jar
包,里面有我们常用的 slf4j
, spring-boot
等 jar
包。
所以, Spring Boot
的项目一般都较大,有一部分原因是把许多第三方包都打包进去了。
解决方案
@Autowired
一个 ResourceLoader
,然后调用 getResource
方法,加载资源。
想想也不难理解, SpringBoot
启动时读取 application.yml
配置, Spring
的源码中就是使用 ResourceLoader
实现的。
只不过源码中直接用的上下文对象,一个上下文对象不只是一个 IOC
容器,还是一个资源加载器。(上下文其实有很多的功能,可以点开 Spring
源码看一看,很有意思。)
ResourcePatternResolver
派生自 ResourceLoader
接口。
代码模版,以后读取文件就这样写,啥毛病没有:
Resource resource = this.resourceLoader.getResource(ResourceUtils.CLASSPATH_URL_PREFIX + "static/导入学生模板.xlsx");
总结
千淘万漉虽辛苦,吹尽狂沙始到金。
一路走来,一路总结。最后留下的,是小本本中记录的代码模版与最佳实践。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Operations
John Allspaw、Jesse Robbins / O'Reilly Media / 2010-6-28 / USD 39.99
A web application involves many specialists, but it takes people in web ops to ensure that everything works together throughout an application's lifetime. It's the expertise you need when your start-u......一起来看看 《Web Operations》 这本书的介绍吧!