日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;}}

總結

以上是生活随笔為你收集整理的Easyexcel异常处理:getOutputStream() has already been called for this response的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。