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

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

@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();
        }
    }
}

使用方法

  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 @ 2024-03-13 18:43  绿茶汤圆  阅读(288)  评论(0)    收藏  举报