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
相关产品推荐
相关产品推荐

