1. 概要

Webアプリケーションの一般的な要件は、カスタマイズされたエラーページです。

たとえば、Tomcat上でバニラのSpringMVCアプリを実行しているとします。 ユーザーがブラウザに無効なURLを入力すると、あまりユーザーフレンドリーではない青と白のスタックトレースが表示されます。これは理想的ではありません。

このチュートリアルでは、いくつかのHTTPエラーコード用にカスタマイズされたエラーページを設定します。

作業上の前提は、読者がSpringMVCでの作業にかなり慣れていることです。 そうでない場合は、これはを開始するのに最適な方法です。

この記事では、SpringMVCに焦点を当てています。 記事ホワイトラベルエラーページのカスタマイズでは、SpringBootでカスタムエラーページを作成する方法について説明しています。

2. 簡単な手順

ここで実行する簡単な手順から始めましょう。

  1. web.xmlに単一のURL/ errors を指定します。これは、エラーが生成されるたびにエラーを処理するメソッドにマップされます。
  2. マッピング/errors を使用して、ErrorControllerというコントローラーを作成します。
  3. 実行時にHTTPエラーコードを把握し、HTTPエラーコードに従ってメッセージを表示しますたとえば、404エラーが生成された場合、ユーザーには次のようなメッセージが表示されます。 ‘リソースが見つかりません’、 一方、500エラーの場合、ユーザーは次の行に何かが表示されるはずです。 ‘ごめん! 内部サーバーエラーが最後に生成されました」

3. web.xml

まず、 web.xmlに次の行を追加します:

<error-page>
    <location>/errors</location>
</error-page>

この機能は、3.0以降のサーブレットバージョンでのみ使用できることに注意してください。

アプリ内で生成されたエラーはすべて、HTTPエラーコードに関連付けられています。 たとえば、ユーザーがURL / invalidUrl をブラウザーに入力したが、そのようなRequestMappingがSpring内で定義されていなかったとします。 次に、基盤となるWebサーバーによって生成された404のHTTPコード。 追加したばかりの行 web.xml URLにマップされているメソッドで記述されたロジックを実行するようにSpringに指示します /errors。

ここで簡単に説明します。対応するJavaサーブレット構成には、残念ながらエラーページを設定するためのAPIがありません。したがって、この場合、実際にはweb.xmlが必要です。

4. コントローラー

次に、ErrorControllerを作成します。 エラーをインターセプトしてエラーページを表示する単一の統合メソッドを作成します。

@Controller
public class ErrorController {

    @RequestMapping(value = "errors", method = RequestMethod.GET)
    public ModelAndView renderErrorPage(HttpServletRequest httpRequest) {
        
        ModelAndView errorPage = new ModelAndView("errorPage");
        String errorMsg = "";
        int httpErrorCode = getErrorCode(httpRequest);

        switch (httpErrorCode) {
            case 400: {
                errorMsg = "Http Error Code: 400. Bad Request";
                break;
            }
            case 401: {
                errorMsg = "Http Error Code: 401. Unauthorized";
                break;
            }
            case 404: {
                errorMsg = "Http Error Code: 404. Resource not found";
                break;
            }
            case 500: {
                errorMsg = "Http Error Code: 500. Internal Server Error";
                break;
            }
        }
        errorPage.addObject("errorMsg", errorMsg);
        return errorPage;
    }
    
    private int getErrorCode(HttpServletRequest httpRequest) {
        return (Integer) httpRequest
          .getAttribute("javax.servlet.error.status_code");
    }
}

5. フロントエンド

デモンストレーションの目的で、エラーページを非常にシンプルでコンパクトに保ちます。 このページには、白い画面に表示されるメッセージのみが含まれます。 errorPage.jsp:という名前のjspファイルを作成します

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
    <title>Home</title>
</head>
<body>
    <h1>${errorMsg}</h1>
</body>
</html>

6. テスト

アプリケーション内で発生する最も一般的な2つのエラー、HTTP404エラーとHTTP500エラーをシミュレートします。

サーバーを実行し、 localhost:8080 / spring-mvc-xml/invalidUrl。 このURLは存在しないため、エラーページに「」というメッセージが表示されると予想されます。 Httpエラーコード:404。 リソースが見つかりません’。

ハンドラーメソッドの1つがスローするときに何が起こるか見てみましょう NullPointerException。 次のメソッドをに追加します ErrorController:

@RequestMapping(value = "500Error", method = RequestMethod.GET)
public void throwRuntimeException() {
    throw new NullPointerException("Throwing a null pointer exception");
}

に移動します localhost:8080 / spring-mvc-xml/500Error。 「HttpErrorCode:500」というメッセージが表示された白い画面が表示されます。 内部サーバーエラー’。

7. 結論

SpringMVCを使用してさまざまなHTTPコードのエラーページを設定する方法を確認しましたHTTPエラーコードに従ってエラーメッセージが動的に表示される単一のエラーページを作成しました。