分享

struts2 java.lang.IllegalStateException: getWriter() has already been called for this response(异常解决)

 昵称50554009 2018-02-26

 预告: 重点请看最后面。

做excel导出时遇到的问题,很多时候会遇到此错误,异常如下:

  1. java.lang.IllegalStateException: getWriter() has already been called for this response  
  2.     at org.apache.catalina.connector.Response.getOutputStream(Response.java:628)  
  3.     at org.apache.catalina.connector.ResponseFacade.getOutputStream(ResponseFacade.java:196)  
  4.     at com.wrt.action.order.EndOrderAction.exportInfo(EndOrderAction.java:143)  
  5.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  6.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)  
  7.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
  8.     at java.lang.reflect.Method.invoke(Method.java:606)  
  9.     at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:446)  
  10.     at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:285)  
  11.     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)  
  12.     at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)  
  13.     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)  
  14.     at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)  
  15.     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)  
  16.     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)  
  17.     at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)  
  18.     at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)  
  19.     at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)  
  20.     at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:242)  

背景如下:
使用Struts2框架,点击某个按钮实现列表excel导出
2.大致代码如下
  1. public void exportInfo(){  
  2.         try {  
  3.             //web对象  
  4.             HSSFWorkbook wb = new HSSFWorkbook();  
  5.             //创建表头等  
  6.             HSSFSheet sheet = wb.createSheet("test1");  
  7.             //创建行  
  8.             HSSFRow row = sheet.createRow(0);  
  9.             //创建列  
  10.             HSSFCell cell = row.createCell(0);  
  11.             //**************省略excel创建部分..  
  12.             HttpServletResponse response = ServletActionContext.getResponse();  
  13.             OutputStream output = getRepsonse().getOutputStream();    
  14.             response.reset();   
  15.             response.setHeader("Content-disposition", "attachment; filename=details.xls");    
  16.             response.setContentType("application/msexcel");            
  17.             wb.write(output);  
  18.             output.close();  
  19.             System.out.println("成功创建excel文件");  
  20.         } catch (Exception e) {  
  21.             e.printStackTrace();  
  22.         }  
  23.     }  
 
最终解决方案,将response.reset(); 放到OutputStream output = getRepsonse().getOutputStream();前面,
  1. HttpServletResponse response = ServletActionContext.getResponse();  
  2.             response.reset();   
  3.             OutputStream output = getRepsonse().getOutputStream();    
  4.             response.setHeader("Content-disposition", "attachment; filename=details.xls");    
  5.             response.setContentType("application/msexcel");    

 运行效果如下成功。 
.


原因,避免可能出现未关闭的getWriter(),使用了response.reset();进行刷新,而此时却在未刷新的情况下进行了OutputStream output = getRepsonse().getOutputStream();操作.....    简之:就是位置放错了 .



会出现如下异常的三种可能:
1.通过response.reset(); 刷新可能存在一些未关闭的getWriter().  来源:http://blog.csdn.net/wonder4/article/details/8476603
2.struts2请求方法中返回了success此类会返回数据或者界面的,举例如下:
public String saveSubmitOrder(){
return "success";
}
改成
public String saveSubmitOrder(){
return null;
}
或者void。
3.存在多个getWriter且未关闭状态,或者getWriter与OutputStream同时出现。

总之,一个请求过来只会有一个返回结果,如果存在两个或以上则会出现此异常.






    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多