Cannot call sendError() after the response has been committed


在下載excel模版時報錯:

2017-10-18 11:48:08.217 [http-bio-8080-exec-16] WARN o.s.w.s.m.support.DefaultHandlerExceptionResolver at 156 - Handling of [org.springframework.web.HttpMediaTypeNotAcceptableException] resulted in Exception
java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:466) ~[catalina.jar:7.0.65]
at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:128) ~[servlet-api.jar:na]
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpMediaTypeNotAcceptable(DefaultHandlerExceptionResolver.java:246) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.doResolveException(DefaultHandlerExceptionResolver.java:119) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1183) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1020) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) [servlet-api.jar:na]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) [servlet-api.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [catalina.jar:7.0.65]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.65]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat7-websocket.jar:7.0.65]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.65]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.65]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) [spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) [catalina.jar:7.0.65]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.65]

下載模版的方法

protected void uploadTemplate(HttpServletResponse res, HttpServletRequest req, String excelName,
            String templatePath) throws Exception {
    
        this.request = req;
        this.response = res;
        this.excelName = excelName;
        InputStream in = null;
        try {
            // 打開已有的excel
            in = new FileInputStream(templatePath);
            // 新建excel
            XSSFWorkbook wb = new XSSFWorkbook(in);
            setResponseHeader();
            OutputStream os = res.getOutputStream();
            wb.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            logger.error("err method:uploadTemplate,Exception:{}", e);
            throw e;
        } finally {
            try {
                in.close();
            } catch (IOException e) {
                logger.error("err method:exportExcel 關閉流失敗");
                throw e;
            }
        }
    }

調用的controller方法

@ResponseBody
    @RequestMapping(value = "uploadTemplate", method = RequestMethod.POST)
    public ResultDTO uploadTemplate(HttpServletResponse res, HttpServletRequest req) throws Exception {
        try {
            String excelName = "污水廠水質監測";
            Long orgId = req.getParameter("orgId") == null ? null : Long.valueOf(req.getParameter("orgId"));
            String technicsId = "";
            if (orgId != null) {
                Waterworks ww = waterWorksService.findByRemarks(orgId.toString());
                if (ww != null) {
                        technicsId = ww.getTechnics().toString();
                }
            }
            String strExcelPath = "";
            if (ConstantDicId.SWZP_DIC_ID.equals(technicsId)) {
                strExcelPath = RealityExpenditureController.class.getClassLoader().getResource("ModelSewage.xlsx")
                        .getPath();
                super.uploadTemplate(res, req, excelName, strExcelPath);
            } else if (ConstantDicId.SWJCYHF_DIC_ID.equals(technicsId)) {
                strExcelPath = RealityExpenditureController.class.getClassLoader().getResource("ModelAAO.xlsx")
                        .getPath();
                this.uploadTemplateAAO(res, req, excelName, strExcelPath);
            }

        } catch (Exception e) {
            logger.error("err method:.uploadTemplate,Exception:{}", e);
            return ResultDTO.getFailure("uploadTemplate failure");
        }
        return ResultDTO.getSuccess("", "uploadTemplate success");  //錯誤的地方
    }

出現這個錯誤,一定是多次response導致的。可以這么理解,承載客戶端和服務器進行Http交互的Socket連接已經關閉了,而你還試圖發送數據給客戶端,顯然會出錯。就好比我倆打電話,我都掛電話了,你還在“喂喂喂”。在上面的代碼中uploadTemplate方法中已經調用了流的close方法  在此之后在return 信息就會導致這個錯誤

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM