记录解决HttpServletResponse在参数报错的问题

下载excel功能需要用到HttpServletResponse,注入一直报错,java.lang.IllegalStateException: getOutputStream() has already been called for this response

1
2
@Resource
    HttpServletResponse httpServletResponse;

  使用注入的方法没问题

刚开始用的gson报栈溢出的错误,后来换成了fastjson报这个错误,最后定位在日志aop这里,会将HttpServletResponse 当做传过来的参数解析 冲突报错,

方法一,注释日志改用手每条controller手动加log的方法;

方法二,使用@resource注入获得HttpServletResponse ;

方法三,使用try catch 抓掉不做处理 ;我选这种

 

另外附上刚找到可以使用的excel导出代码

复制代码
@Slf4j
public class ExcelUtil {

    /**
     * 导出excel
     *
     * @param fileName excel文件名称
     * @param sheetName excel sheet名称
     * @param list 数据
     * @param clazz
     * @param response
     */
    public static void exportExcel(String fileName, String sheetName, List<?> list, Class<?> clazz, HttpServletResponse response){
        ServletOutputStream outputStream;
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf8");

            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
            outputStream = response.getOutputStream();
            EasyExcel.write(outputStream)
                    .head(clazz)
                    .excelType(ExcelTypeEnum.XLSX)
                    .sheet(sheetName)
                    .doWrite(list);
            outputStream.flush();
        } catch (Exception e) {
            log.error("导出excel异常:{}",e.getMessage());
            e.printStackTrace();
        }
    }
}
复制代码

使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void downloadPerformanceTemplate(HttpServletResponse response) {
 
      List<UserDetailDO> userDetailDOS =
              userDetailMapper.selectList(new LambdaQueryWrapper<UserDetailDO>().orderByAsc(UserDetailDO::getDeptId));
      List<TemporaryPerformanceVO> collect = userDetailDOS.stream().map(t -> {
          TemporaryPerformanceVO temporaryPerformanceVO = new TemporaryPerformanceVO();
          BeanUtils.copyProperties(t, temporaryPerformanceVO);
          temporaryPerformanceVO.setUserName(t.getName());
          temporaryPerformanceVO.setOvertime(0);
          temporaryPerformanceVO.setNightShift(0);
          temporaryPerformanceVO.setSickLeave(0);
          return temporaryPerformanceVO;
      }).collect(Collectors.toList());
      ExcelUtil.exportExcel("绩效模板","绩效模板",collect,TemporaryPerformanceVO.class
      ,response);
  }

  

posted @   绿茶汤圆  阅读(230)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示