关于excel导出功能的一个很奇怪的bug
2016-12-09 16:41
253 查看
开发了数月终于把web项目上线了,然而不幸的是,没过多久就收到用户的投诉,说每隔一段时间就会连不上数据库,而且这个时间还是不固定的,还好后台配了日志,查日志查好久终于揪出了一个很奇葩的错误:
(报的是空指针错误)
Unknown Source?
当时一开始以为是负载的问题,访问量太大把数据库搞崩了,于是各种调参数,改连接池配置都没用,就这么搞了两三天之后,才发现原来问题的罪魁祸首是其中一个模块的功能:导出Excel,一旦使用了这个功能之后,后面所有指向这个Controller的操作全都得不到执行,所有请求都是报500错误。
发现原因了就好办,看代码去。这里用的是poi组件,参考了某篇博客的代码(雷同的实在太多了,我也不知道原创者是谁)
看起来好像没什么问题,是吧?
罪魁祸首在这:
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真累~~~
(报的是空指针错误)
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真累~~~
相关文章推荐
- SourceProvider.getJniDirectories
- Trac 中文语言安装
- 软件 bug 的生命周期
- Firefox2中输入框丢失光标bug的解决方法
- for命令的一些bug分析
- 修正IE下使用CSS属性overflow的bug
- 解决IE6 3像素Bug的css写法
- 利用ASP.NET MVC+Bootstrap搭建个人博客之修复UEditor编辑时Bug(四)
- 跟我学习JScript的Bug与内存管理
- JS注释所产生的bug 即使注释也会执行
- IE本地存储userdata的一个bug说明
- IE在DOM操作有表单控件时的bug
- ie 处理 gif动画 的onload 事件的一个 bug
- jsp利用POI生成Excel并在页面中导出的示例
- IIS6 安全性存在超级BUG,快来看
- Android生存指南之:解Bug策略与思路问题的详解
- shell脚本中case条件控制语句的一个bug分析
- 关于在IE下的一个安全BUG --可用于跟踪用户的系统鼠标位置
- jQuery ajax BUG:object doesn't support this property or method
- ShareSDK造成App崩溃的一个BUG原因分析以及Fix方法