哈哈,之前计划的每周至少更新一个博客的计划又因为各种原因都泡汤了。看来坚持真得是一件挺让人头疼的问题,无论如何,从这周开始接下来每周一定要至少更新一个技术博客,欢迎大家监督!
好,言归正传。之前前几周遇到开发过程中遇到这样一种这样的问题,不知道大家有没有遇到过,就是我在spring boot中使用mave将项目打包成jar包部署到linux服务器上后,当我运行一个接口时,居然报错了,这里我贴出来给大家看下,如下图所示:
从上图的报错信息可以看到,系统找不到json目录下riskSchemeModelPackage.json这个文件,我就纳闷了,但是在我本地window系统下是可以的呀,我找到了该报错信息所对应的代码,并贴到了下面,同时我也贴出了打包的类路径图,大伙们可以看下。
int riskSchemeModelPackageContentLength = cn.hutool.core.io.FileUtil.readUtf8String("classpath:json/riskSchemeModelPackage.json").getBytes(StandardCharsets.UTF_8).length * 2;
从以上的代码和图片中大家都可以看到打包的类路径的根目录下是确确实实有这个目录和文件的,并且在本地windows系统运行是没有任何问题的,到底是什么原因导致的呢?经过分析,应该是hutool包中FileUtil这个工具类有点问题,于是我果断换了一种读取方法的方法,如下面的代码所示:
int riskSchemeModelPackageContentLength = IoUtil.readBytes(new FileInputStream(new ClassPathResource("json/riskSchemeModelPackage.json").getFile())).length * 2;
我使用了new ClassPathResource()这种方式去专门读取类路径下的路径,并使用getFile()获取到riskSchemeModelPackage.json所对应的File对象,然后使用new FileInputStream()方法将File对象转成文件输入流的形式,最后使用IoUtil工具类将其转为byte(字节)。本来以为大功告成了,谁知当我重新部署到linux系统一运行,程序又给我抛出了空指针这个runtime exception,仔细一排查,原来是getFile()返回的是null,所以才导致了这个空指针异常,那么又怎么解决呢?看来解决一个问题后还会产生一个新问题呀,无奈之下,谷歌一搜索看到还真有一些老哥遇到过这样的坑,不过幸好这些老哥很给力,给出了一些不错的解决方案。其中我找到了一个不错的解决方案,那就是将读取文件改成读取文件流的形式,也就是将getFile()改成getInputStream()。于是我果断就行了修改,如下代码所示:
int riskSchemeModelPackageContentLength = IOUtils.toString(new ClassPathResource("json/riskSchemeModelPackage.json").getInputStream(), CharsetUtil.UTF_8).getBytes(StandardCharsets.UTF_8).length * 2;
当我重新部署上去后再次运行了接口,没想到居然可以了!!!终于功夫不负有心人,我把这个问题搞定了!