最近在做项目的时候由以前的war包部署在tomcat中运行,改成了Spring boot框架,Spring boot框架更加简单方便的搭建一个web应用。
之前的代码在改造的过程中遇到了一个关于附件处理的坑,之前在war包运行的时候,使用了Spring提供的ResourceLoader获取附件,代码是这样写的:
@Autowired
private ResourceLoader resourceLoader;
protected File getExportFile(MultivaluedMap<String, String> mm)
throws IOException {
return resourceLoader.getResource("classpath:tpl/DemoTpl.docx").getFile();
}
使用Spring boot了之后代码代码在Eclipse中直接运行是可以正常使用的,但是当打包成jar包,放到docker上运行的时候就出问题了,提示获取不到file,这个就坑了,后来通过eclipse远程调试,找到了问题的原因,关于怎么在eclipse中远程调试,可以查看我的另一篇博客:
Eclipse远程调试
代码打包成jar包后,目录结构发生变化了之前的tpl放在了BOOT-INF这个下面,但是路径里面多了一个!号导致取不到文件,后来才发现jar包里面是没有File实体的,因为File必须要放到一个磁盘目录下面。找到原因后就改成直接去Io流Stream了,而且用IO流的好处要比File好处更多,优化后的代码为:
protected InputStream getExportTplInputStream(MultivaluedMap<String, String> mm)
throws IOException {
return resourceLoader.getResource("classpath:tpl/DemoTpl.docx").getInputStream();
}
在有文件处理的地方,更加推崇用Io流的方式取代直接操作File