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 信息就会导致这个错误

 

posted @ 2017-10-18 14:33  夜无良  阅读(12664)  评论(0编辑  收藏  举报