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