Open Ta9m1-N opened 8 months ago
内部エラー発生時にそのままスタックトレースが出力されているが、公開時には404または500ページを表示したい。 404以外のエラー全てで表示される500ページを作成し、500ページでスタックトレースを表示するかをserver.error.include-stacktraceプロパティで切り替えられるようにする。
404.htmlを踏襲したerror/500.htmlを作成し、500.htmlではスタックトレースがある場合に表示させるようにする。 DefaultErrorAttributesクラスを継承したGlobalExceptionHandlerクラスを作成し、HTTPステータスが404の時は404.htmlを、404以外の時は500.htmlを表示させる。また、server.error.include-stacktraceプロパティの値がneverの時にスタックトレースを表示させないようにする。 開発環境の500ページでスタックトレースを確認した後、server.error.include-stacktraceプロパティをneverに変更し、公開時の500ページでスタックトレースが表示されないことを確認する。
を追加し、\にth:text="${stackTrace}"を追加 GlobalExceptionHandlerクラスの作成
にth:text="${stackTrace}"を追加 GlobalExceptionHandlerクラスの作成
概要
内部エラー発生時にそのままスタックトレースが出力されているが、公開時には404または500ページを表示したい。 404以外のエラー全てで表示される500ページを作成し、500ページでスタックトレースを表示するかをserver.error.include-stacktraceプロパティで切り替えられるようにする。
修正方針
404.htmlを踏襲したerror/500.htmlを作成し、500.htmlではスタックトレースがある場合に表示させるようにする。 DefaultErrorAttributesクラスを継承したGlobalExceptionHandlerクラスを作成し、HTTPステータスが404の時は404.htmlを、404以外の時は500.htmlを表示させる。また、server.error.include-stacktraceプロパティの値がneverの時にスタックトレースを表示させないようにする。 開発環境の500ページでスタックトレースを確認した後、server.error.include-stacktraceプロパティをneverに変更し、公開時の500ページでスタックトレースが表示されないことを確認する。
タスクリスト
500.htmlの作成
の内容を500に変更し、.pageの\の内容を削除
- [x] 内容を削除した\
の子要素として\- [x] DefaultErrorAttributesクラスを継承し、Environmentクラス(org.springframework.core.env)をDIしておく
- [x] {ControllerAdvice}, {Controller}アノテーションをクラスに付与
- [x] WebRequestオブジェクトを渡すとリクエストのHttpStatusを返すgetStatus(WebRequest)メソッドを作成
- [x] Object型の変数statusにWebRequestオブジェクト.getAttribute(引数2つ)を代入してステータスを取得
- [x] 引数は"javax.servlet.error.status_code"とWebRequest.SCOPE_REQUESTの2つ
- [x] statusがnullでないとき、HttpStatus.valueOf((Integer)status)を返却
- [x] デフォルトはHttpStatus.INTERNAL_SERVER_ERROR(500エラー)を返却
- [x] {ExceptionHandler(Exception.class)}アノテーションを付与したhandleException(引数)メソッドを作成
- [x] 引数はException ex, WebRequest request, Model model
- [x] HttpStatus型の変数statusにgetStatus(request)メソッドを代入
- [x] statusがHttpStatus.NOT_FOUND(404エラー)のとき、"error/404"を返却
- [x] それ以外の時、Environmentオブジェクトからserver.error.include-stacktraceプロパティの値を取得しておく
- [x] プロパティの値がneverでない時、exからPrintWriter、StringWriterを介してスタックトレースを取得
- [x] StringWriter、PrintWriterの順に宣言(PrintWriterの引数にはStringWriterの変数)
- [x] ex.printStackTrace(PrintWriterの変数)でスタックトレースを取得
- [x] modelにStringWriter変数.toString()を"stackTrace"として追加
- [x] "error/500"を返却
- [x] \の\
500.htmlの整形