【问题标题】:java.lang.IllegalStateException: getOutputStream() has already been called for this response [duplicate]java.lang.IllegalStateException:getOutputStream() 已为此响应调用 [重复]
【发布时间】:2014-11-12 14:47:39
【问题描述】:

当用户单击某个链接时,使用 Web 服务将文档从远程 ECM 系统传输到用户机器。

所以我创建了 servlet 并从 Query 字符串并从 URL 获取参数。

根据参数属性,调用了几个与 Web 服务相关的方法来获取文件详细信息和文件内容。现在调用 servlet 和用户系统之间的文件传输。

最大的担忧是,除了以下例外,代码片段可以正常工作。用户可以将文档保存在所需的位置。我试图弄清楚为什么会出现此错误。

错误:

java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:611)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
t  DownloadServlet.doGet(DownloadServlet.java:99)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:662)

代码## 下载Servlet.java

 getDocument(HttpServletRequest request,HttpServletResponse response)
   {
 \\used Custom web services methods to get filename with extensions from external ECM system 
   File resultFile = content.getAsFile();
   response.setContentType("application/octet-stream");  
   ServletOutputStream outStream = response.getOutputStream();          
   try {
       response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
       byte[] byteBuffer = new byte[BUFSIZE];
       DataInputStream in = new DataInputStream(new FileInputStream(file));
          while ((in != null) && ((length = in.read(byteBuffer)) != -1)){
            outStream.write(byteBuffer,0,length);
            }
            in.close();
            outStream.flush();                              
      } catch (Exception e) {
          e.printStackTrace();
      }finally{
          outStream.close();
      }

 }

【问题讨论】:

标签: java jakarta-ee


【解决方案1】:

我在使用 Struts 2 框架处理 Web 应用程序时遇到了同样的问题。 我搜索了一段时间,找到的解决方案对我有用。 我在某处发现:

HTTP 的基本规则:一个请求,一个响应。 您只能将一件事发送回请求。 HTML 页面、PDF 文档或图像等。 如果您已经获得了 writer/outputstream,Java 会抱怨,因为您应该只获得其中之一。

在我的情况下,下载文件的操作类在文件下载后向请求返回一个字符串“成功”,这导致了问题。我将方法的返回类型更改为 void 并解决了问题。

【讨论】:

  • 谢谢乔。我的动作类没有返回任何东西,它是 Private void getDocument(....)。如果交易不成功并且我无法获取文档,我将响应内容类型设置为“text/html”并使用 PrintWriter 打印 HTMl 页面中的其余错误
【解决方案2】:

您的回复有问题。
所以使用这两条线。

 response.getOutputStream().flush();
 response.getOutputStream().close();

【讨论】:

  • OP 已经在执行这两个调用。
  • 我在 try 块和 finally 块中做同样的事情。
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2015-10-30
  • 2019-10-10
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多