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 {// 打開已有的excelin = new FileInputStream(templatePath);// 新建excelXSSFWorkbook 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 信息就會導致這個錯誤
?
轉載于:https://www.cnblogs.com/yujianhuang/p/7686533.html
總結
以上是生活随笔為你收集整理的Cannot call sendError() after the response has been committed的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 keil中编译遇到的问题
- 下一篇: Python istitle() 方法