You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring替换Controller报viewResolver错误 启动导出JPA数据到xlsx失败问题

存在的问题

  • 手动实例化CardServiceImpl:你在saveCards方法中直接new了CardServiceImpl对象,该对象不受Spring容器管理,其中@Autowired注入的CardRepository会是null,调用findAll会触发空指针异常,逻辑无法正常执行。
  • 未配置启动触发逻辑:SaveCards是普通Java类,没有和Spring启动流程绑定,Spring启动完成后不会自动执行其中的saveCards方法。
  • 代码语法错误:saveExcel方法的循环中遍历变量名为card,但你调用属性时用了eCard,变量名不匹配,会直接编译报错。
  • 误删Controller导致的配置问题:你替换原有Controller类的操作破坏了Spring Web的自动配置,才会触发viewResolver相关报错,导出逻辑和原有Controller并不冲突,无需删除原有Controller。

解决步骤

1. 修正SaveCards类代码

将该类交给Spring容器管理,注入依赖的CardService,修正变量名错误:

@Component
public class SaveCards {
    // 注入Spring管理的CardService
    @Autowired
    private CardService cardService;

    // 去掉static修饰
    public void saveCards() throws IOException {
        saveExcel(cardService.findAll(), "fileName.xlsx");
    }

    private static void saveExcel(List<Card> list, String fileName) throws IOException {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Cards");
        sheet.setColumnWidth(0, 6000);
        sheet.setColumnWidth(1, 4000);
        sheet.setColumnWidth(2, 4000);

        Row header = sheet.createRow(0);
        CellStyle headerStyle = workbook.createCellStyle();
        headerStyle.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
        headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        XSSFFont font = ((XSSFWorkbook) workbook).createFont();
        font.setFontName("Arial");
        font.setFontHeightInPoints((short) 16);
        font.setBold(true);
        headerStyle.setFont(font);

        Cell headerCell = header.createCell(0);
        headerCell.setCellValue("full_name");
        headerCell.setCellStyle(headerStyle);

        headerCell = header.createCell(1);
        headerCell.setCellValue("login");
        headerCell.setCellStyle(headerStyle);

        headerCell = header.createCell(2);
        headerCell.setCellValue("balance");
        headerCell.setCellStyle(headerStyle);

        CellStyle style = workbook.createCellStyle();
        style.setWrapText(true);

        // 行号从1开始,0是表头,原写法2会空出第一行数据
        int ix_row=1;
        for (Card card : list) {
            Row row = sheet.createRow(ix_row);
            Cell cell = row.createCell(0);
            // 修正变量名,用card而不是eCard
            cell.setCellValue(card.getFull_name());
            cell.setCellStyle(style);

            cell = row.createCell(1);
            cell.setCellValue(card.getLogin());
            cell.setCellStyle(style);

            cell = row.createCell(2);
            cell.setCellValue(card.getBalance());
            cell.setCellStyle(style);

            ix_row++;
        }

        // 建议指定绝对路径,避免找不到生成的文件,例如:
        // String filePath = System.getProperty("user.dir") + File.separator + fileName;
        // FileOutputStream outputStream = new FileOutputStream(filePath);
        FileOutputStream outputStream = new FileOutputStream(fileName);
        workbook.write(outputStream);
        outputStream.close();
        workbook.close();
    }
}

2. 配置启动时自动执行

让SaveCards实现CommandLineRunner接口,Spring启动完成后会自动执行run方法中的逻辑:

@Component
public class SaveCards implements CommandLineRunner {
    @Autowired
    private CardService cardService;

    @Override
    public void run(String... args) throws Exception {
        // 启动时调用导出方法
        saveCards();
    }

    // 其余原有方法保持上面修正后的逻辑即可
}

3. 恢复原有Controller类

把你之前删掉的CardController恢复回来,不需要替换原有Controller,导出逻辑和接口逻辑可以共存,避免出现viewResolver相关的启动报错。

4. 清理冗余代码

可以删除CardServiceImpl中没用的List<ECard> list = new ArrayList<>();代码,避免不必要的编译警告。


内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 17:15:00