1. 序章

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

2. JakartaEEサーブレットの例外

最初に、 APIアノテーションを使用してサーブレットを定義します(詳細については、サーブレットイントロを参照してください)。デフォルトのGETプロセッサがスローされます。例外:

@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 にアクセスすると、デフォルトのサーブレットエラー処理が実行されます。

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

4. カスタムエラー処理

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

  • ステータスコードエラー処理– HTTPエラーコード(クライアントおよびサーバー)を静的HTMLエラーページまたはエラー処理サーブレットにマッピングできます
  • 例外タイプのエラー処理–例外タイプを静的HTMLエラーページまたはエラー処理サーブレットにマップできます

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

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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">

    <error-page>
        <error-code>404</error-code>
        <location>/error-404.html</location> <!-- /src/main/webapp/error-404.html-->
    </error-page>

</web-app>

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

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

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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1">
    <error-page> 
        <exception-type>java.lang.Exception</exception-type> 
        <location>/errorHandler</location> 
    </error-page>
</web-app>

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

@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("<html><head><title>Error description</title></head><body>");
            writer.write("<h2>Error description</h2>");
            writer.write("<ul>");
            Arrays.asList(
              ERROR_STATUS_CODE, 
              ERROR_EXCEPTION_TYPE, 
              ERROR_MESSAGE)
              .forEach(e ->
                writer.write("<li>" + e + ":" + req.getAttribute(e) + " </li>")
            );
            writer.write("</ul>");
            writer.write("</html></body>");
        }
    }
}

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

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

ErrorHandlerServlet コンポーネントでコンテナ提供のサーブレットロガーを使用して、追加の詳細をログに記録することもできます。

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

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

5. 結論

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

いつものように、ソースコードはサーブレットチュートリアルリポジトリにあります。