【问题标题】:"getOutputStream()" has already been called for this response已经为此响应调用了“getOutputStream()”
【发布时间】:2015-08-13 15:21:36
【问题描述】:

我正在使用 Spring 进行一个项目,我遇到了这个问题,我用谷歌搜索了错误消息,我确实找到了解决方案,即使所有 SO 帖子都关于这个问题

java.lang.IllegalStateException: "getOutputStream()" has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:578)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:212)
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109)
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:115)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:108)
    at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:175)
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:120)
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
    at org.apache.jsp.WEB_002dINF.Pages.generate_jsp._jspService(generate_jsp.java:209)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:721)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:584)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:523)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:230)
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

这是我的控制器:

    @RequestMapping(method = RequestMethod.GET, value = "/GenerateM")
    public String genererGet(HttpServletRequest request, ModelMap model, HttpServletResponse response) throws Exception {
   // Some code ...

        OutputStream out;
        try {
            response.setContentType("rtf");
            String filename = name + ".out.rtf";
            response.setHeader("Content-Disposition", "attachment; filename = " + filename);
            out = response.getOutputStream();
            FileInputStream in = new FileInputStream(new File(rtf.getRtfOutput()));
            byte[] buffer = new byte[4096];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
            in.close();
            out.flush();
            out.close();
        } catch (IOException a) {
            a.printStackTrace();
        }
        return "generate";
    }

我看到很多 SO 帖子,例如:THISTHISTHIS 但我没有解决方案

有人可以帮忙吗?

【问题讨论】:

    标签: java spring spring-mvc tomcat8


    【解决方案1】:

    您首先自己编写响应,然后返回视图的名称,从而告诉 Spring 它应该使用generate.jsp 生成一个 HTML 页面。

    让您的方法返回 void 而不是字符串。一个 HTTP 响应只能有一个主体:要么是文件附件,要么是 HTML 页面,但不能两者兼有。

    【讨论】:

    • 现在它给了我一个org.apache.catalina.connector.ClientAbortException: java.io.IOException: An established connection was aborted by the software in your host machine 错误消息,例如this
    • 不要关闭响应输出流。这就是容器的工作。
    【解决方案2】:

    @JB Nizet 感谢您的帮助。就我而言,我在下载失败时返回了ModelAndViewojbect 错误页面:

    @RequestMapping(value = { "/downloadfile.action" }, method = RequestMethod.POST)
    public ModelAndView downloadFile(HttpServletRequest req, HttpServletResponse res, Model model)
    {
      catch (Excetion e) {
        return errorPage
      }   
    }
    

    我将其更改为返回null

    【讨论】:

      猜你喜欢
      • 2016-03-03
      • 2017-07-17
      • 2023-03-08
      • 1970-01-01
      • 2020-01-08
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多