【问题标题】:Spring boot web application throws getOutputStream() has already been called for this responseSpring Boot Web 应用程序抛出 getOutputStream() 已为此响应调用
【发布时间】:2017-02-14 20:34:58
【问题描述】:

我有使用 spring boot 1.4.0.RELEASE 构建的 spring boot web 应用程序,嵌入式 tomcat 版本是 8.5.4。我偶尔会在我的日志中看到“由于 getOoputStream() 已调用而导致的 IllegalStateException”异常。我不知道具体什么时候来。

使用jsp、tiles和mvc rest控制器构建的spring boot webapp。其余控制器非常简单,它不使用响应流。这是我的错误日志,

Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:609) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:109) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:118) ~[tomcat-embed-jasper-8.5.4.jar!/:8.5.4]
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:111) ~[tomcat-embed-jasper-8.5.4.jar!/:8.5.4]
    at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:176) ~[tomcat-embed-jasper-8.5.4.jar!/:8.5.4]
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:120) ~[tomcat-embed-jasper-8.5.4.jar!/:8.5.4]
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75) ~[tomcat-embed-jasper-8.5.4.jar!/:8.5.4]
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) ~[tomcat-embed-jasper-8.5.4.jar!/:8.5.4]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:443) ~[tomcat-embed-jasper-8.5.4.jar!/:8.5.4]
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385) ~[tomcat-embed-jasper-8.5.4.jar!/:8.5.4]
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329) ~[tomcat-embed-jasper-8.5.4.jar!/:8.5.4]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:186) ~[spring-security-web-3.2.3.RELEASE.jar!/:3.2.3.RELEASE]
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) ~[spring-security-web-3.2.3.RELEASE.jar!/:3.2.3.RELEASE]
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:726) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:592) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:526) ~[tomcat-embed-core-8.5.4.jar!/:8.5.4]
    at org.apache.tiles.request.servlet.ServletRequest.doInclude(ServletRequest.java:243) ~[tiles-request-servlet-1.0.0.jar!/:1.0.0]
    at org.apache.tiles.request.servlet.ServletRequest.doForward(ServletRequest.java:226) ~[tiles-request-servlet-1.0.0.jar!/:1.0.0]
    at org.apache.tiles.request.AbstractClientRequest.dispatch(AbstractClientRequest.java:57) ~[tiles-request-api-1.0.0.jar!/:1.0.0]
    at org.apache.tiles.request.render.DispatchRenderer.render(DispatchRenderer.java:45) ~[tiles-request-api-1.0.0.jar!/:1.0.0]
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:259) ~[tiles-core-3.0.0.jar!/:3.0.0]
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:397) ~[tiles-core-3.0.0.jar!/:3.0.0]
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:238) ~[tiles-core-3.0.0.jar!/:3.0.0]
    at org.apache.tiles.impl.BasicTilesContainer.render(BasicTilesContainer.java:221) ~[tiles-core-3.0.0.jar!/:3.0.0]
    at org.apache.tiles.renderer.DefinitionRenderer.render(DefinitionRenderer.java:59) ~[tiles-core-3.0.0.jar!/:3.0.0]
    at org.springframework.web.servlet.view.tiles3.TilesView.renderMergedOutputModel(TilesView.java:132) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1257) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.2.RELEASE.jar!/:4.3.2.RELEASE]
    ... 25 more








   @Controller
    @RequestMapping("/")
    public class MainController{        
        @RequestMapping(value = {"/list"}, method = RequestMethod.GET)
        public String blacklist(ModelMap model) {
            //processing
            return "list";
        }

        @RequestMapping(value = {"/Find"}, method = RequestMethod.POST)
        public String find(ModelMap model, @ModelAttribute("attribute1")String attr) {
            //processing
            return "list";
        }
    }

【问题讨论】:

    标签: spring spring-mvc spring-boot


    【解决方案1】:

    大多数情况下,此错误与提交响应后调用任何 servlet 方法有关。检查您的 servlet 代码以查看是否在 response.forward 或 response.flush 方法之后编写了任何代码行。写入响应后,甚至可以是 System.out。

    【讨论】:

    • 我的项目中没有servlet,都是spring控制器。代码中没有 sys out。还有什么我应该看的吗?
    【解决方案2】:

    如果你返回的 bean/object 没有 setter 或 getter,或者不能被反射,你会得到这个错误。

    【讨论】:

      【解决方案3】:

      如果你同时使用了拦截器,请检查一下。也许拦截器使用响应 - outputStream。

      【讨论】:

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