Easyexcel异常处理:getOutputStream() has already been called for this response

文章目录

  • 异常日志
  • 源码位置
  • 异常原因
  • 异常前代码
  • 调整后代码

异常日志

java.lang.IllegalStateException: getOutputStream() has already been called for this responseat org.apache.catalina.connector.Response.getWriter(Response.java:582) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:227) ~[tomcat-embed-core-9.0.17.jar!/:9.0.17]at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:152) ~[javax.servlet-api-3.1.0.jar!/:3.1.0]

源码位置

看起来是,output流使用标志生效导致异常。
在这里插入图片描述

异常原因

一句话总结:同一个请求中:调用了两次response.getOutputStream()方法。或者先进行了respose的头等信息设置后调用response.getOutputStream()

异常前代码

控制层:

    @RequestMapping(value ="/detailExport" ,method = RequestMethod.POST)@BusiResponseBodypublic void detailExport(@RequestBody IdReqBO queryBO, HttpServletRequest request,HttpServletResponse response ) {//获取导出的元数据(转换器、格式控制器、导出内容等)ExcelExportContent excelExportContent = excelExportStrategy.exportDetailExcelContent(request.getRequestURI(), queryBO);EasyExcelUtils.ExportResponse(excelExportContent,response);}

工具类:

public class EasyExcelUtils {public static void ExportResponse(ExcelExportContent excelExportContent,HttpServletResponse response){try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode(excelExportContent.getFileName(), "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//这里先设置的response的头、编码等信息,导致response.getOutputStream()时异常ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(response.getOutputStream(), excelExportContent.getAccountDataClass()).registerConverter(new BigDecimalStringConverter()).registerConverter(new DateStringConverter());List<WriteHandler> writeHandler = excelExportContent.getWriteHandler();for (WriteHandler handler : writeHandler) {excelWriterBuilder.registerWriteHandler(handler);}excelWriterBuilder.sheet(excelExportContent.getSheetName()).doWrite(excelExportContent.getAccountData());} catch (Exception e){e.printStackTrace();throw new ZTBusinessException(e.getMessage());}}
}

调整后代码

控制层不变:

    @RequestMapping(value ="/detailExport" ,method = RequestMethod.POST)@BusiResponseBodypublic void detailExport(@RequestBody IdReqBO queryBO, HttpServletRequest request,HttpServletResponse response ) {//获取导出的元数据(转换器、格式控制器、导出内容等),可忽略ExcelExportContent excelExportContent = excelExportStrategy.exportDetailExcelContent(request.getRequestURI(), queryBO);EasyExcelUtils.ExportResponse(excelExportContent,response);}

工具类:
这里格式化response的动作只能在response.getOutputStream()之后,在EasyExcel的doWrite之前。
在response.getOutputStream()之前会出现getOutputStream() has already been called for this response异常。在EasyExcel的doWrite之后,流已经被写回了,格式化response不会生效,写回的内容是txt格式。

public class EasyExcelUtils {protected static Logger logger = LoggerFactory.getLogger(EasyExcelUtils.class);public static void ExportResponse(ExcelExportContent excelExportContent, HttpServletResponse response) {try {ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(response.getOutputStream());//这里格式化response内容只能在这个位置FormatResponse(response, excelExportContent.getFileName());ExcelWriterSheetBuilder(excelWriterBuilder, excelExportContent).doWrite(excelExportContent.getDetailData());} catch (Exception e) {e.printStackTrace();throw new ZTBusinessException("ExportResponse exception:" + e.getMessage());}}public static void FormatResponse(HttpServletResponse response, String fileName) {try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String exportFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + exportFileName + ".xlsx");} catch (UnsupportedEncodingException e) {e.printStackTrace();throw new ZTBusinessException("FormatResponse exception:" + e.getMessage());}}private static ExcelWriterSheetBuilder ExcelWriterSheetBuilder(ExcelWriterBuilder excelWriterBuilder, ExcelExportContent excelExportContent) {List<Converter> converterList = Optional.ofNullable(excelExportContent.getConverter()).orElseGet(ArrayList::new);for (Converter converter : converterList) {excelWriterBuilder.registerConverter(converter);}List<WriteHandler> writeHandlerList = Optional.ofNullable(excelExportContent.getWriteHandler()).orElseGet(ArrayList::new);for (WriteHandler writeHandler : writeHandlerList) {excelWriterBuilder.registerWriteHandler(writeHandler);}ExcelWriterSheetBuilder excelWriterSheetBuilder = excelWriterBuilder.sheet(excelExportContent.getSheetName());return excelWriterSheetBuilder;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转DB里的数据—阿里云DMS任务编排之简介和实操

1.任务编排介绍 数据库是企业IT系统里的重要基础设施&#xff0c;里面存储了大量有价值的数据资产&#xff0c;如&#xff1a;交易数据、客户数据、订单数据&#xff0c;等等。其实&#xff0c;数据库在企业里一直扮演着一个数据生产者&#xff08;Producer&#xff09;的角色…

用户隐私保护指引设置~参考案例

文章目录1. 搜索小程序2. 进入小程序详情3. 更多资料4. 小程序隐私指引5. 具体参考事项1. 搜索小程序 这里以腾讯文档进行演示 2. 进入小程序详情 3. 更多资料 4. 小程序隐私指引 5. 具体参考事项 以实际的情况为准&#xff0c;这里只是演示

在存储器的层次结构里,谁最快,谁最贵,谁最大?

来源 | 小林coding责编 | 寇雪芹头图 | 下载于视觉中国前言大家如果想自己组装电脑的话&#xff0c;肯定需要购买一个 CPU&#xff0c;但是存储器方面的设备&#xff0c;分类比较多&#xff0c;那我们肯定不能只买一种存储器&#xff0c;比如你除了要买内存&#xff0c;还要买硬…

云原生存储系列文章:云原生应用的基石

作者| 郡宝 阿里云技术专家 参与文末留言互动&#xff0c;即有机会获得赠书福利&#xff01; 导读&#xff1a;存储服务支撑了应用的状态、数据的持久化&#xff0c;是计算机系统中的重要组成部分&#xff0c;也是所有应用得以运行的基础&#xff0c;其重要性不言而喻。在存储…

java 读取jar包中的文件

文章目录项目resource中文件路径和jar包中文件路径的区别正常读取jar包读取完整代码&#xff1a;项目resource中文件路径和jar包中文件路径的区别 打成jar包后&#xff0c;是一个整体的文件。 正常读取 InputStream inputStream new FileInputStream("src/main/resource…

算法真的太重要了!CSDN用动画帮你快速 get 核心原理

无论你是 Java&#xff0c;Python&#xff0c;还是 PHP&#xff0c;面试总逃脱不了一个问题&#xff1a;算法&#xff01;算法是面试常问的问题&#xff0c;这也是程序员准备面试之前&#xff0c;常刷数据结构与算法的原因之一&#xff01;算法成为程序员头疼的难题&#xff0c…

开启阿里云对象存储OSS防误删新功能,保护您珍贵的数据。

一、背景 阿里云对象存储 OSS 是保存海量数据的平台&#xff0c;支持丰富的应用。在使用过程中难免会遇到误操作、程序 Bug、覆盖写等导致数据被删除的场景&#xff0c;对于数据的丢失会非常着急&#xff0c;后果也非常严重&#xff0c;甚至某些情况下还会影响你的职业生涯。O…

拥抱创新,持续探索——对话阿里云MVP胡逢法

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 胡逢法作为阿里云 MVP&#xff0c;是一名经验丰富的人工智能领域研究专家&#xff0c;谦虚诚恳、精力充沛。…

Optional 处理空指针

实际开发中经常会遇到判空需求的处理&#xff0c;通常我们可以采用if判断的形式&#xff1a; ArrayList<String> nullAbleList demoService.getList(); if(CollectionUtils.isEmpty(nullAbleList )){//new 一个ArrayList&#xff0c;避免下面业务逻辑空指针异常nullAbl…

远程工作和数字鸿沟

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 在全球持续蔓延的冠状病毒疫情的影响下&#xff0c;一场革命正在发生&#xff1a;弹性工作革命。很多企业开始意识到这样一个…

Serverless的初心、现状和未来

作者 | 不瞋 阿里云高级技术专家 导读&#xff1a;Serverless 是如何产生的&#xff1f;当前有哪些落地场景&#xff1f;Serverless 的未来又将如何&#xff1f;本文分享了阿里云高级技术专家不瞋对于 Serverless 的看法&#xff0c;回顾其发展历程&#xff0c;并对 Serverle…

查询每个用户最后一次登录信息

文章目录表结构和数据&#xff1a;方法一&#xff1a;如果只需要用户id和最后一次登陆时间方法二&#xff1a;如果需要携带其他日志信息方法三&#xff1a;oracle数据库 使用row_num() over表结构和数据&#xff1a; CREATE TABLE temp_test (id bigint(20) DEFAULT NULL,user…

存储极简史一幅图你就都懂了

原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

唐云峰:想当科学家的怪极客

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 跟唐云峰对话的时间比我们预想的都要长很久&#xff0c;却丝毫不觉得疲倦。聊到被奉为电脑神童的经历、中学…

maven导入异常 PKIX path building failed

异常信息&#xff1a; PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 解决方案&#xff1a;修改配置 -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.…

网飞是如何利用大数据做出热门电视剧的?

责编 | 寇雪芹来源 | CDA数据分析师头图 | 下载于视觉中国收集更多的数据会就会有更好的决策吗&#xff1f;像亚马逊、谷歌和网飞这样有竞争力、精通数据的公司已经认识到&#xff0c;单靠数据分析并不总能产生最佳结果。在文中&#xff0c;数据科学家塞巴斯蒂安韦尼克分析了当…

软件研发的这些误区,你中了吗?

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 结束了一天的工作&#xff0c;拖着疲惫的身躯&#xff0c;坐在马桶上&#xff0c;回顾一天的工作&#xff0c;发现有那么多的…

linux 部署后,前后端正常访问 点击菜单报:Cannot find module ‘@/views/system/user/index‘

现象&#xff1a; 解决方案&#xff1a; https://pan.baidu.com/s/1E9J52g6uW_VFWY34fHL6zA 提取码: vneh 微服务工具包/基础工具包/node-v14.16.1-x64.msi export const loadView (view) > {return (resolve) > require([/views/${view}], resolve) }参考链接&…

【mac】maven canot down resources

1.选择项目 &#xff0c;open in terminal 2.执行命令 mvn dependency:resolve -Dclassifiersources3.如果遇到mvn not commond source ~/.bash_profile

迪士尼自研算法突破百万高清像素用AI换脸来拍电影

AI换脸又一次刷爆了朋友圈 最近云毕业正当时&#xff0c;各家科技公司顺势推出了自己的AI换脸技术&#xff0c;结果又被同学们玩坏了&#xff01; 换脸这件事绝不能少了业界大佬们&#xff01; 不得不说&#xff0c;好看是不分性别的&#xff0c;彦宏兄气质满分&#xff01; …