2011-01-19 36 views
2

投稿者this投稿私は別の質問を考えていますが、私はインターウェブ上の答えを見つけることができないようです。サーブレット例外スタックトレースの出力を非表示/処理します

セッションタイムアウトを検出し、エラーページにリダイレクトするサーブレットフィルタがあります。私の初心者のJavaのために私は例外をキャッチし、正常にそれらを処理するキャッチブロックを使用しましたが、セッションのタイムアウト状況では、コンテキストが無効なので、私はそれを行うことができます任意のコードを持っているとは思わない私はそれを処理するフィルタを持っているにもかかわらず、私のログに表示される 'viewIdは復元できませんでした'ステイストレースを停止します。

例外トレースがログに表示されないようにするにはどうすればよいですか?ライブで自動的に監視され、この種のエラーのためにサポートチームに誤った肯定的な呼びかけがあります。

助けてください。より明確にすることが

EDIT

、私のコードクリップは現在

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    try { 
     chain.doFilter(request, response); 
    } catch (ServletException e) { 
     logger.error("Caught Servlet Exception"); 
     Throwable rootCause = e.getRootCause(); 
     logger.error("Root cause is " + rootCause.toString()); 

     if (rootCause instanceof RuntimeException) { // This is true for any FacesException. 
      logger.error("Rethrowing exception as RuntimeException" + rootCause.toString()); 
      throw (RuntimeException) rootCause; // Throw wrapped RuntimeException instead of ServletException. 
     } else { 
      throw e; 
     } 
    } 
} 

ログは言うです:

|STDOUT| 2011-01-19 10:40:57,803 | ERROR | [http-8080-5]: Exception in the filter chain 
    javax.servlet.ServletException: viewId:/index.jsf - View /index.jsf could not be restored. 
     at javax.faces.webapp.FacesServlet.service(FacesServlet.java:270) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178) 
     at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290) 
<snip> 
     at java.lang.Thread.run(Unknown Source) 
    Caused by: javax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored. 
<snip> 
     at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265) 
     ... 21 more 
    19-Jan-2011 10:40:57 org.apache.catalina.core.StandardWrapperValve invoke 
    SEVERE: Servlet.service() for servlet Faces Servlet threw exception 
    javax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored. 
     at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:185) 
<snip> 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
     at java.lang.Thread.run(Unknown Source) 
    |STDOUT| 2011-01-19 10:40:57,803 | ERROR | [http-8080-5]: Caught Servlet Exception 
    |STDOUT| 2011-01-19 10:40:57,803 | ERROR | [http-8080-5]: Root cause is javax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored. 
    |STDOUT| 2011-01-19 10:40:57,803 | ERROR | [http-8080-5]: Rethrowing exception as RuntimeExceptionjavax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored. 

あなたがコードから見ることができるように、私はしましたフィルタでサーブレットの例外を検出しましたが、スタックにログが残っています。次のように私のweb.xml内のフィルタの

次の編集 完全なリストは、次のとおりです。

<filter> 
    <filter-name>Error</filter-name> 
    <filter-class>prismClient.ErrorFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>Error</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter> 
    <display-name>RichFaces Filter</display-name> 
    <filter-name>richfaces</filter-name> 
    <filter-class>org.ajax4jsf.Filter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>richfaces</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 

答えて

0

あなたは、セッションフィルタを自分で書いてみましたか?良い例はhereです。

+0

私は自分でフィルタを書きました。あなたの例は本質的に私が既に書いたものです(私はhttpプロトコルに私のものを限定していません)。より具体的に私の投稿を編集しました。 – volvox

+0

あなたはそこでViewExpiredExceptionを処理しません。 –

+0

いいえ、私はそれが何であるかRunTimeExceptionとして扱います。 – volvox

1

おそらく、あなたが例外を却下したため、それはまだロギングされているものであれ、それを取得している可能性があります。 ServletExceptionをブロックしてRunTimeException(ViewExpiredException)を再スローしても、フィルタチェーンの上位のものが再ラッピングする可能性があります。

この方法で書き込むログは、スタックトレースの前にログに記録されますか?

+0

あなたの言葉をありがとう。あなたの質問に答えて、いいえ - スタックトレースは常に最初です。 – volvox

+0

それでは、再暴行が問題になるとの私の予想は間違っているはずです。残念ながら私はこの時点でこれ以上のアイデアは持っていません。 –

4

フィルタは、web.xmlファイルで定義されている順序で実行されます。あなたのケースでは、jfacesフィルタが最初に実行され、カスタムフィルタがフィルタリングする前にスタックトレースを記録するように見えます。フィルタのエントリを最初にweb.xmlにしてみてください。

EDIT

それはそれを投げる前に、チェーン内の他のフィルタがServletExceptionをログに記録されている可能性があります。あなたが投稿したスタックトレースには、ServletExceptionを記録しているajax4jsfのフィルタがあるようです。あなたはこれのための情報源を持っていますか? web.xmlにはどのようなフィルタがありますか?

EDIT 2

AJAX4JSFがServletExceptionをキャッチし、それをバックスローする前にエラーメッセージを記録しているように見えます。私はあなたが使用しているajax4jsfのバージョンのソースを取得し、スタックトレース(BaseXMLFilter.java行178とBaseFilter.java行290)の行を見て、ロギングステートメントを検索することをお勧めします。見つかった場合は、ソースから削除してajax4jsfを再構築するか、ロギング設定ファイルでカテゴリを無効にすることができます。フィルタで発生する可能性のある他のエラーが発生する可能性があるため、後者はお勧めしません。

これはエラーメッセージの原因ではない場合は、私はアイデアが不足していると思います。

+0

+1:考えられる理由。 –

+0

しかし、残念ながら働いていません。私はRichFacesフィルタの前にフィルタエントリ( 'filter'と' filter-mapping')を入れて、セッションタイムアウト時にはまだログにスタックトレースを取得しています。私は本当に標準的な方法でLog4Jを使用します。 – volvox

+0

ジェイソンあなたの永続性のために多くのありがとう。私は自分の投稿を編集して、私のフィルタの完全で順序付けられたリストを含めました。あなたが言及したal4sfフィルタが表示されますが、私はそこに持っていなければならないという印象を受けています。一方、設定は、魚の別のケトルです。これはリッチフェイスの設定文書で推奨されていると定義されています。私のOPに基づいてどのように設定するのが良いかをお気軽にお聞かせください。 – volvox