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,にアクセスすると、デフォルトのサーブレットエラー処理が実行されます。
デフォルトのエラー処理はサーブレットコンテナによって提供され、containerまたはアプリケーションレベルでカスタマイズできます。
4. カスタムエラー処理
次のタイプのポリシーを定義できるweb.xmlファイル記述子を使用して、カスタムエラー処理を定義できます。
4.1. HTMLページでのステータスコードエラー処理
web.xmlでHTTP404エラーのカスタムエラー処理ポリシーを設定できます。
404
/error-404.html
次に、ブラウザからhttp://localhost:8080/javax-servlets/invalid.htmlにアクセスして、静的HTMLエラーページを取得します。
4.2. サーブレットを使用した例外タイプのエラー処理
web.xmlのjava.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にアクセスして、カスタムエラーサーブレットが機能していることを確認できます。
Note:web.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にあります。