Java EEサーブレットの例外処理

Java EEサーブレットの例外処理

1. 前書き

このチュートリアルでは、Java EE Servletアプリケーションで例外を処理し、エラーが発生したときに適切で期待される結果を提供します。

2. Java EEサーブレットの例外

まず、例外をスローするデフォルトのGETプロセッサを使用して、API annotationsを使用してサーブレットを定義します(詳細については、Servlets Introを参照してください)。

@WebServlet(urlPatterns = "/randomError")
public class RandomErrorServlet extends HttpServlet {

    @Override
    protected void doGet(
      HttpServletRequest req,
      HttpServletResponse resp) {
        throw new IllegalStateException("Random error");
    }
}

3. デフォルトのエラー処理

ここで、アプリケーションをサーブレットコンテナにデプロイするだけです(アプリケーションはhttp://localhost:8080/javax-servletsで実行されると想定します)。

アドレスhttp://localhost:8080/javax-servlets/randomError,にアクセスすると、デフォルトのサーブレットエラー処理が実行されます。

image

デフォルトのエラー処理はサーブレットコンテナによって提供され、containerまたはアプリケーションレベルでカスタマイズできます。

4. カスタムエラー処理

次のタイプのポリシーを定義できるweb.xmlファイル記述子を使用して、カスタムエラー処理を定義できます。

  • Status code error handling – HTTPエラーコード(clientおよびserver)を静的HTMLエラーページまたはエラー処理サーブレットにマッピングできます

  • Exception type error handling –例外タイプを静的HTMLエラーページまたはエラー処理サーブレットにマップできます

4.1. HTMLページでのステータスコードエラー処理

web.xmlでHTTP404エラーのカスタムエラー処理ポリシーを設定できます。



    
        404
        /error-404.html 
    

次に、ブラウザからhttp://localhost:8080/javax-servlets/invalid.htmlにアクセスして、静的HTMLエラーページを取得します。

4.2. サーブレットを使用した例外タイプのエラー処理

web.xmljava.lang.Exceptionにカスタムエラー処理ポリシーを設定できます。


    
        java.lang.Exception
        /errorHandler
    

ErrorHandlerServletでは、リクエストで提供されたerror attributesを使用してエラーの詳細にアクセスできます。

@WebServlet(urlPatterns = "/errorHandler")
public class ErrorHandlerServlet extends HttpServlet {

    @Override
    protected void doGet(
      HttpServletRequest req,
      HttpServletResponse resp) throws IOException {

        resp.setContentType("text/html; charset=utf-8");
        try (PrintWriter writer = resp.getWriter()) {
            writer.write("Error description");
            writer.write("

Error description

"); writer.write("
    "); Arrays.asList( ERROR_STATUS_CODE, ERROR_EXCEPTION_TYPE, ERROR_MESSAGE) .forEach(e -> writer.write("
  • " + e + ":" + req.getAttribute(e) + "
  • ") ); writer.write("
"); writer.write(""); } } }

これで、http://localhost:8080/javax-servlets/randomErrorにアクセスして、カスタムエラーサーブレットが機能していることを確認できます。

Noteweb.xmlで定義された例外タイプが広すぎるため、処理するすべての例外をより詳細に指定する必要があります。

ErrorHandlerServletコンポーネントのcontainer-provided servlet loggerを使用して、追加の詳細をログに記録することもできます。

Exception exception = (Exception) req.getAttribute(ERROR_EXCEPTION);
if (IllegalArgumentException.class.isInstance(exception)) {
    getServletContext()
      .log("Error on an application argument", exception);
}

サーブレットが提供するロギングメカニズム以外に何があるかを知る価値があります。詳細については、guide on slf4jを確認してください。

5. 結論

この短い記事では、外部コンポーネントやライブラリを追加せずに、サーブレットアプリケーションでデフォルトのエラー処理とカスタムエラー処理を指定しました。

いつものように、ソースコードはServlets tutorial repositoryにあります。