1

私は興味深い目的に直面しました。この目的は、ウィケットおよび休止状態のフレームワークで記述された既存の Web アプリケーションの例外処理を対象としています。サーバーにデプロイされた Web アプリがあり、それが実行時例外を生成する場合があるとします。問題は、取得および保存する方法です。すべてのクラス (約 80 のモデルと 150 のビュー) を変更せずにスタック トレースを db にします。

私がすべてを明確にしたことを願っています。
前もって感謝します。

4

3 に答える 3

6

を使用しIRequestCycleListenerて、例外をログに記録/処理できます。

public class MyExceptionReporter extends AbstractRequestCycleListener {

    @Override
    public IRequestHandler onException(RequestCycle cycle, Exception ex) {
        // log exception here
        return null;
        // if you want to also show an error page:
        // return new RenderPageRequestHandler(new PageProvider(new ExceptionPage(ex)));
    }
}

次に、次の場所に登録しWebApplication#initます。

getRequestCycleListeners().add(new MyExceptionReporter());
于 2012-09-07T08:34:33.603 に答える
5

Wicket 1.4 以前

アプリケーション内のすべての に対して追加のロギング動作を提供するために、そのオーバーライドApplication.newRequestCycle()のカスタム サブクラスをオーバーライドして返します。キャッチされなかったものは、Wicket によって次のようにラップされることに注意してください(リクエスト サイクルとリクエスト サイクル プロセッサの例外処理セクションで説明されているように):WebRequestCycleRequestCycle.logRuntimeException()RuntimeExceptionExceptionWicketRuntimeException

そこで、スタックトレースとともに例外メッセージをデータベースに挿入する Service/DAO コンポーネントを使用します。dbms によっては、varchar 型の代わりに CLOB を使用したい場合があることに注意してください (たとえば、Oracle では、varchar 列は 4000 バイトを超える値を保持できません)。

これは(テストされていない)例です:

public class myApplication extends WebApplication { 
    ...
    @Override
    public RequestCycle newRequestCycle(Request request, Response response) {
        return new myRequestCycle(this, (WebRequest) request, (WebResponse) response);
    }
} 

public class myRequestCycle extends WebRequestCycle { 
    ...
    @Override
    protected void logRuntimeException(RuntimeException rex) {
        super.logRuntimeException(rex);
        Writer w = new StringWriter();
        t.printStackTrace(new PrintWriter(w));
        String stackTrace = w.toString();
        someService.logExceptionToDB(rex.getMessage(),stackTrace);
    } 
} 

ウィケット 1.5 以降

@Cristophの回答を参照してください

于 2012-09-07T08:00:39.267 に答える
0

StackTraceElement[] を使用して完全なスタックトレースを提供するユーティリティを作成します。OutputStream の実装を使用して、それを CLOB オブジェクトにプッシュします。(BLOBは必要ないと思います)

于 2012-09-07T07:50:13.213 に答える