springMVC报getOutputStream() has already been called for this response的解决方法

深碍√TFBOYSˉ_ 2022-03-21 05:42 323阅读 0赞

背景:最近用springMVC在做数据导出/文件下载功能时,在访问下载方法时程序报以下错误:

  1. 严重: Servlet.service() for servlet [jsp] threw exception
  2. java.lang.IllegalStateException: getOutputStream() has already been called for this response
  3. at org.apache.catalina.connector.Response.getWriter(Response.java:624)
  4. at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211)
  5. at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109)
  6. at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:118)
  7. at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:111)
  8. at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:176)
  9. at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:120)
  10. at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
  11. at org.apache.jsp.WEB_002dINF.pages.cargo.outproduct.jOutProduct_jsp._jspService(jOutProduct_jsp.java:211)
  12. at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
  13. at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
  14. at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443)
  15. at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:386)
  16. at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
  17. at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
  18. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
  19. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  20. at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
  21. at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:591)
  22. at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:527)
  23. at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:162)
  24. at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
  25. at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370)
  26. at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)
  27. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
  28. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
  29. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:998)
  30. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:890)
  31. at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
  32. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:875)
  33. at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
  34. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
  35. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  36. at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  37. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  38. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  39. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
  40. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  41. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  42. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  43. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
  44. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
  45. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
  46. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
  47. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
  48. at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
  49. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
  50. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
  51. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
  52. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
  53. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
  54. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
  55. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  56. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  57. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  58. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  59. at java.lang.Thread.run(Thread.java:748)

经过排查发现导致问题的原因是在获取输出流的同时返回了视图结果:

获取输出流

  1. OutputStream os = null;
  2. try {
  3. os = response.getOutputStream(); //获取输出流
  4. bos.writeTo(os); //数据写入输出流
  5. } catch (IOException e) {
  6. e.printStackTrace();
  7. }

返回视图结果

  1. return "/cargo/outproduct/jOutProduct.jsp";

很显然,这里两次调用了getOutputStream(),因此报错。
**解决方法:**既然是做文件下载功能,并不需要返回视图结果,那么就可以将该方法改为无返回类型的方法,同时删除return语句。

参考资料:
https://stackoverflow.com/questions/3540464/java-lang-illegalstateexception-getoutputstream-has-already-been-called-for-t?r=SearchResults

发表评论

表情:
评论列表 (有 0 条评论,323人围观)

还没有评论,来说两句吧...

相关阅读