質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

1219閲覧

Herokuにデプロイしたアプリの一部ページで500エラーが発生する

asahiko123

総合スコア43

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/08/23 04:28

編集2021/08/23 07:36

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ファイルの出力に失敗していると思われます。

Herokuを使ったことがないので、間違っているかもしれませんが、Herokuでは一時ファイルのみ書き込めるそうです。
ファイルシステムとの間の読み取りや書き込みはできますか?


この一時ファイルを使う場合、以下のような方法があります。

  1. java.io.tmpdirを使って、tmpフォルダの場所を取得して書き込む
  2. File.createTempFile()で、tmpフォルダに直接書き込む(第三引数がない場合、java.io.tmpdirの場所にファイルを書き込みます)

ファイル・ディレクトリー操作

java

1System.out.println("tmpフォルダの場所:" + System.getProperty("java.io.tmpdir")); 2 3File file = File.createTempFile("temp",".xlsx");

その他参考サイト:Stackoverflow

ただし、Herokuのドキュメントを読む限りは、かなりの制限があります。保存したい内容であれば「DBに書き込む」か「AWS S3などのストレージサービス」も、ご検討ください。

投稿2021/08/26 15:01

KT001

総合スコア659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asahiko123

2021/08/27 05:20

回答ありがとうございます。 herokuの仕様を理解しておりませんでした。 今回はデータを保持したいので、他の方法を検討したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問