web-dev-qa-db-ja.com

カスタムエラーページ(Tomcat)でメッセージを取得するにはどうすればよいですか?

JSPでは、response.sendError(int code, String message)を使用して、特定のエラーコード(たとえば、見つからない場合は404)とメッセージを返すことができます。デフォルトの醜いTomcatエラーページを使用している限り、これらのメッセージは正常に表示されます。ただし、カスタムエラーページを作成した場合、どのようにしてそのメッセージを受け取りますか? exception.getMessage()またはpageContext.getErrorData()を試しましたが、役に立ちませんでした。私はこれを何時間も探していましたが、誰も同じことを不思議に思っているようには見えません! :S

これまで404でしか試したことがないので、それが最も必要なことだと言うのを忘れました...何らかの理由で例外がnullであるため、何かを試すとNullPointerExceptionがスローされます。エラーページは404エラーページであり、web.xmlを介して設定され(すべての単一の404エラーに対して表示されるようにしたいので)、疑問に思っている人のために、はい、isErrorPageディレクティブがtrueに設定されています...

26
Lea Verou

エラーメッセージは、エラーページjspのリクエストオブジェクトのjavax.servlet.error.message属性から入手できます。

アクセスするためのjsp構文は次のとおりです。

<c:out value="${requestScope['javax.servlet.error.message']}"/>

エラーページで利用可能な他のエラー関連情報を探すことができます ここ新しいエラー属性の下。

13

うーんexception.getMessage()は機能するはずです

exception.getClass().getName()を追加してみてください

  1. メッセージのないNullPointerExceptionである可能性があります
  2. または、例外がSunからのものではなく、メッセージが正しく設定されていません

もちろん、これは、私が正しく覚えていれば、エラーが上部に<%@ page errorPage="/yourerrorpage.jsp" %>が付いたjspによってスローされた場合にのみ機能します。

エラーがサーブレットから発生した場合、例外の詳細はリクエスト属性として渡されます

javax.servlet.error.status_code    Java.lang.Integer
javax.servlet.error.exception_type Java.lang.Class
javax.servlet.error.message        Java.lang.String
javax.servlet.error.exception      Java.lang.Throwable
javax.servlet.error.request_uri    Java.lang.String
javax.servlet.error.servlet_name   Java.lang.String

サーブレット仕様 セクション9.9を確認してください

9
jitter

回答が遅くなって申し訳ありませんが、ちょうど1週間前にこの問題に直面しました。さまざまなサイトを閲覧しましたが、誰もこの問題を私が聞きたい方法で実際に理解していませんでした。この投稿で、私はいくつかの興味深い解決策を見つけて、それから私自身に思いつきました。このソースをページに含めるだけです。

<%
    out.println(pageContext.getErrorData().getRequestURI());
    out.println("<br/>");
    out.println(pageContext.getErrorData().getStatusCode());
    out.println("<br/>");
    out.println(pageContext.getException());
    out.println("<br/>");
%>

それは私と完全にうまくいきました。

3
russian eagle

あなたが欲しいものは私には奇妙に見えます:)。そうは言っても、私は次のことをします:

  1. HttpResponseWrapperを実装して、他のHttpResponseを次のようにラップします。

    public class HttpResponseWrapper implements HttpResponse {
        private String errorMessage;
    ...
    
        @Override
        public void sendError(...) {
            <save error message here>
        }
    ...
    }
    
  2. フィルタを作成し、これで応答をラップします

  3. すべてのリクエストにフィルターをかけ、チェーンの最初に

  4. エラーページで、応答がHttpResponseWrapperのインスタンスであるかどうかを確認します

  5. メッセージを受け取る

0
Georgy Bolyuba

exceptionErrorData部分は、応答エラーコードではなく、例外の結果としてエラーページが読み込まれた場合にのみ設定されます。

sendErrorHttpServletResponseについては javadoc を参照してください。 sendErrorに渡したメッセージが表示されない理由が記載されています(私の強調):

指定されたステータスを使用して、クライアントにエラー応答を送信します。サーバーはデフォルトで、指定されたメッセージを含むHTML形式のサーバーエラーページのように見える応答を作成し、コンテンツタイプを「text/html」に設定し、Cookieやその他のヘッダーを変更しないままにします。 渡されたステータスコードに対応するWebアプリケーションに対してエラーページ宣言が行われた場合、提案されたmsgパラメータよりも優先して返されます。

応答がすでにコミットされている場合、このメソッドはIllegalStateExceptionをスローします。この方法を使用した後、応答はコミットされていると見なされ、書き込まれるべきではありません。

0
jimr

あなたが使用することができます

${requestScope['javax.servlet.error.message']}

ページにjstlがない場合

0
Lê văn Huy