您的位置:首页 > 其它

关于excel导出功能的一个很奇怪的bug

2016-12-09 16:41 253 查看
开发了数月终于把web项目上线了,然而不幸的是,没过多久就收到用户的投诉,说每隔一段时间就会连不上数据库,而且这个时间还是不固定的,还好后台配了日志,查日志查好久终于揪出了一个很奇葩的错误:

(报的是空指针错误)



Unknown Source?

当时一开始以为是负载的问题,访问量太大把数据库搞崩了,于是各种调参数,改连接池配置都没用,就这么搞了两三天之后,才发现原来问题的罪魁祸首是其中一个模块的功能:导出Excel,一旦使用了这个功能之后,后面所有指向这个Controller的操作全都得不到执行,所有请求都是报500错误。

发现原因了就好办,看代码去。这里用的是poi组件,参考了某篇博客的代码(雷同的实在太多了,我也不知道原创者是谁)

OutputStream out = null;
try {
out = response.getOutputStream();
response.reset();
String fileName = produceRandomName();
response.setHeader("Content-Disposition","attachment;filename="+fileName+".xls");
response.setContentType("application/vnd.ms-excel");
ExcelFileGenerator generator = new ExcelFileGenerator(headers, rows);
generator.expordExcel(out);
System.setOut(new PrintStream(out));
out.close();
} catch (Exception e) {
e.printStackTrace();
}


看起来好像没什么问题,是吧?

罪魁祸首在这:

System.setOut(new PrintStream(out));
为什么呢?
我一开始猜测是重定向没关

于是在后面将其重新定向回去

但是并没有用

后来我看到了这篇博客找到了答案:
http://blog.sina.com.cn/s/blog_605f5b4f01013bnp.html
原来是保存流的方法错了,应该改成这样:

PrintStream originalOutputStream=System.out;
System.setOut(new PrintStream(out));
out.close();
System.setOut(originalOutputStream);
因此解决方案如下:

1. 注释掉重定向那句,影响不大,只是文件时间不显示了而已

2.  恢复重定向

吸取教训,下次用到重定向这种操作一定要记得还原,特别是SpringBoot这种框架,每个Controller实例化的对象只有一个,如果不还原的话,后续将会引发各种各样无法预知的错误。

DEBUG真累~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息