前提・実現したいこと
Herokuにデプロイしたアプリで一部ページが500エラーを発生させています。
ローカル環境では問題なく動いていたのですが、原因がわからず困っています。
アプリ自体はSpringBootのMVCを用いた基本的なCRUD機能を持つアプリになります。
発生している問題・エラーメッセージ
コマンドでheroku logs --tailした時のログ
2021-08-23T04:06:29.320888+00:00 heroku[router]: at=info method=GET path="/main/report/output" host=dailyreportapptest.herokuapp.com request_id=a7ff5edb-7062-4afb-b53d-f19397a1fec0 fwd="14.10.63.0" dyno=web.1 connect=0ms service=30ms status=500 bytes=442 protocol=https
該当のソースコード
controllerで"/main/report/output"を指定した部分
//エクセル出力を行う @RequestMapping("/report/output") public String download(RedirectAttributes redirectAttributes, DailyReportForm dailyReportForm, DailyReport dailyReport, Model model) throws IOException { List<DailyReport> list = dailyReportService.findAll(); int i = 1; //テンプレートファイルの参照、読み込み //Pathはローカルで指定 Path tempPath = Paths.get("C:\Users\hullh\git\DailyReport\src\main\resources\static\excel\template_dailyReport.xlsx"); InputStream inst = Files.newInputStream(tempPath); Workbook workbook = new XSSFWorkbook(inst); FileOutputStream out = null; //シート、セル、行の作成 Sheet sheet = workbook.getSheetAt(0); Cell[][] cell; cell = new Cell[7][8]; Row[] row; row = new Row[7]; //スタイル指定 CellStyle style = workbook.createCellStyle(); style.setBorderBottom(BorderStyle.THIN); style.setBorderTop(BorderStyle.THIN); style.setBorderRight(BorderStyle.THIN); style.setBorderLeft(BorderStyle.THIN); //セルに値を設定 for(DailyReport objct:list) { id = objct.getId(); stuff = objct.getStuff().getRegisteredId(); date = objct.getCreated(); start = objct.getStartTime(); end = objct.getEndTime(); detail = objct.getDetail(); progress = objct.getDailyReportType().getProgress(); work = objct.getWork().getWorkDivId(); row[i] = sheet.createRow(i); cell[i][0] = row[i].createCell(0); cell[i][1] = row[i].createCell(1); cell[i][2] = row[i].createCell(2); cell[i][3] = row[i].createCell(3); cell[i][4] = row[i].createCell(4); cell[i][5] = row[i].createCell(5); cell[i][6] = row[i].createCell(6); cell[i][7] = row[i].createCell(7); cell[i][0].setCellValue(id); cell[i][0].setCellStyle(style); cell[i][1].setCellValue(stuff); cell[i][1].setCellStyle(style); cell[i][2].setCellValue(progress); cell[i][2].setCellStyle(style); cell[i][3].setCellValue(work); cell[i][3].setCellStyle(style); cell[i][4].setCellValue(date); cell[i][4].setCellStyle(style); cell[i][5].setCellValue(start); cell[i][5].setCellStyle(style); cell[i][6].setCellValue(end); cell[i][6].setCellStyle(style); cell[i][7].setCellValue(detail); cell[i][7].setCellStyle(style); i++; } out = new FileOutputStream("C:\Users\Public\result.xlsx"); workbook.write(out); workbook.close(); redirectAttributes.addFlashAttribute("output","エクセル出力しました"); return "redirect:/main/report"; }
試したこと
上記はエクセル出力を行うコントローラーですが、ローカルでは問題なく出力できました。
他の質問ページ(https://teratail.com/questions/292561)で同じく500エラーの問題が扱われていましたが、
自分の場合はスラッシュが入っていても以下のdeleteはエラーにならずheroku上で機能しています。
@PostMapping("/report/delete") public String delete( Model model, DailyReport dailyReport, @RequestParam("dailyReportId")int id ) { dailyReportService.deleteById(id); return"redirect:/main/report"; }
・Pathがローカルを参照していたので、プロジェクトのルートディレクトリ以下に変更しましたが、変化ありませんでした
Paths.get("C:\Users\hullh\git\DailyReport\src\main\resources\static\excel\template_dailyReport.xlsx"); →変更後 Paths.get("DailyReport\src\main\resources\static\excel\template_dailyReport.xlsx"); out = new FileOutputStream("C:\Users\Public\result.xlsx"); →変更後 out = new FileOutputStream("DailyReport\src\main\resources\static\excel\result.xlsx");
補足情報(FW/ツールのバージョンなど)
Springboot v2.5.0
java11
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/27 05:20