1

失敗したリクエストをデバッグするために、HttpServletRequest からのすべての情報を出力したいと思います。

ここで、リクエストが部分的に失敗する可能性があります (たとえば、いくつかの一致は成功しましたが、1 つが失敗しました)。その場合、失敗した内部メソッドで例外をキャッチし、エラー + ServletUtil.toStringHttpServletRequest( )、サービスの提供を継続します(機能は低下していますが、依然として有用である vs. 完全なリクエストの失敗)。

私たちの現在の実装は、例外をキャッチして愚かな情報を出力するか (「getRules failed」)、doGet() までずっと例外をスローします (ユーザーのサービスを効果的にキャンセルします)。関連するデバッグ情報 (ヘッダー、パラメーターなど) を出力します。

失敗する可能性のあるリクエスト中に呼び出されたすべての関数に HttpServletRequest を渡すのは少し見苦しく思えます。他に洗練されたソリューションが表示されない場合はそうします。

before head ServletUtil.toStringHttpServletRequest() を作成して ThreadLocal マップに格納すると、メモリと CPU 時間の両方で無駄になります。何らかの理由で、HttpServletRequest オブジェクトを ThreadLocal に格納するのは間違っていると感じます (間違っている場合は修正してください)。

デバッグ情報はローカル マシンのログに書き込まれ、開発者に直接電子メールで送信されます (すばらしい作業 log4j TLSSMTPAppender )。そのため、いくつかの場所にログインすることは実用的ではありません (何が起こっているのかを理解するには、いくつかの電子メールをまとめる必要があります)。サーバーは古いです:)(ここではすべて曇っています...エラーを確認するまでにサーバーが存在しない可能性があります)

したがって、私の解決策は「PrintErrorUtility」(TODO: より適切な名前) にアクセスすることです。それは (String errorMsg, Throwable t, HttpServletRequest) を受け取り、エラーを一緒に出力します...これは内部の try {} catch ブロックから呼び出され、エラーについて通知しますが、リクエストはキャンセルされません。それの。

明らかに、私は本番環境で実行されているサーバーについて取り上げています。

コメント? お知らせ下さい。

ありがとう、マキシム。

4

1 に答える 1

0

このタスクは通話Filter 後に行ってください。オブジェクトはすでにそこにありますFilterChain#doFilter()ServletRequestこの例外が適切に抑制されるビジネス コードでは、例外をリクエスト属性として保存し、リクエストFilterからチェック/グラブします。


更新:コメントによると、ここに例があります:

public class Context { 
    private static ThreadLocal<Context> instance = new ThreadLocal<Context>();
    private HttpServletRequest request;
    private List<Exception> exceptions = new ArrayList<Exception>();

    private Context(HttpServletRequest request) {
        this.request = request;
        this.request.setAttribute("exceptions", exceptions);
    }

    public static Context getCurrentInstance() {
        return instance.get();
    }

    public static Context newInstance(HttpServletRequest request) {
        Context context = new Context(request);
        instance.set(context);
        return context;
    }

    public void release() {
        instance.remove();
    }

    public void addException(Exception exception) {
        exceptions.add(exception);
    }
}

そして、コントローラーサーブレットでそれを使用する方法は次のとおりです。

Context context = Context.newInstance(request);
try {
    executeBusinessCode();
} finally {
    context.release();
}

そして、実行されたビジネスコードでそれを使用する方法は次のとおりです。

} catch (Exception e) {
    Context.getCurrentInstance().addException(e);
}
于 2010-07-12T12:07:15.267 に答える