1.はじめに

このチュートリアルでは、/intro-to-servlets[Java EEサーブレット]アプリケーションで例外を処理します。エラーが発生したときにはいつでも優雅で期待される結果を提供するためです。

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

まず、https://tomcat.apache.org/tomcat-9.0-doc/servletapi/index.html[API annotations]を使用してサーブレットを定義します(リンクを見てください:/intro-to-servlets[例外をスローするデフォルトの

GET

プロセッサを使用した詳細は、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

_



にアクセスすると、デフォルトのサーブレットエラー処理が行われます。

リンク:/uploads/servlet-100×24.png%20100w[]

デフォルトのエラー処理はサーブレットコンテナによって提供され、https://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Error

Report

Valve[コンテナ]またはアプリケーションレベルでカスタマイズできます。

4.カスタムエラー処理


web.xml

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


  • ステータスコードのエラー処理

    – HTTPエラーコードをマッピングすることができます。

(https://en.wikipedia.org/wiki/List

of

HTTP

status

codes#4xx

Client

errors[クライアント]そして

https://en.wikipedia.org/wiki/List


of

HTTP

status

codes#5xx

Server

errors[server])
静的HTMLエラーページまたはエラー処理サーブレットへ


例外タイプのエラー処理** – 例外タイプをマッピングすることができます

静的HTMLエラーページまたはエラー処理サーブレットへ

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


web.xml

でHTTP 404エラーに対するカスタムエラー処理ポリシーを設定できます。

<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.xml



java.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

では、リクエストで提供されたhttps://tomcat.apache.org/tomcat-7.0-doc/servletapi/constant-values.html[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("<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

コンポーネントのhttps://javaee.github.io/javaee-spec/javadocs/javax/servlet/ServletContext.html#log-java.lang.String-[container-provided servlet logger]コンポーネントを使用して記録することもできます。追加の詳細:

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

サーブレットが提供するロギングメカニズム以外に何があるのか​​を知っておく価値があります。詳細については、/slf4j-with-log4j2-logback[slf4jのガイド]のリンクを確認してください。

5.まとめ

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

いつものように、ソースコードはhttps://github.com/eugenp/tutorials/tree/master/javax-servlets[Servlets tutorial repository]にあります。