2013-08-01 21 views
6

恐ろしいjavax.faces.application.ViewExpiredExceptionに直面した後、私は適切な解決策を見つけるためにインターネットの周りを見なければならなかった。幸いにも、このソリューションはすぐに利用でき、私は先に進んでOmniFaces FullAjaxExceptionHandlerを採用しました。沈黙FullAjaxExceptionHandler

OmniFacesのすべてのものと同様に、それは不思議に思えました。しかし、私は、ビューが期限切れしているたびに、私は取得しています:

SEVERE: WebModule[/myModule]FullAjaxExceptionHandler: An exception occurred during processing JSF ajax request. Error page '/WEB-INF/errorpages/test.xhtml' will be shown. 
javax.faces.application.ViewExpiredException: viewId:/my/page.xhtml - View /my/page.xhtml could not be restored. 
... 

それが期待通りに処理されるように、これは素晴らしいですが、があるserver.logに印刷されてから、この例外を沈黙させる方法はありますか?これはログをかなり素早く群集化するでしょう。

私が実行しています:
クロサギ科2.1.23
PrimeFaces 4.0-SNAPSHOT
OmniFaces 1.6-SNAPSHOT-2013年7月1日

あたりとして
Glassfishの3.1.2.2

答えて

6

にOmniFaces 1.6の場合は、次のようにメソッドlogException()をオーバーライドして、ViewExpiredExceptionのスタックトレースをスキップできます。

public class YourAjaxExceptionHandler extends FullAjaxExceptionHandler { 

    public YourAjaxExceptionHandler(ExceptionHandler wrapped) { 
     super(wrapped); 
    } 

    @Override 
    protected void logException(FacesContext context, Throwable exception, String location, String message, Object... parameters) { 
     if (exception instanceof ViewExpiredException) { 
      // With exception==null, no trace will be logged. 
      super.logException(context, null, location, message, parameters); 
     } 
     else { 
      super.logException(context, exception, location, message, parameters); 
     } 
    } 

} 

その周りに工場を作成します(FullAjaxExceptionHandlerFactoryの元の登録を削除することを忘れないでください)これを実行するために取得するためには

public class YourAjaxExceptionHandlerFactory extends ExceptionHandlerFactory { 

    private ExceptionHandlerFactory wrapped; 

    public YourAjaxExceptionHandlerFactory(ExceptionHandlerFactory wrapped) { 
     this.wrapped = wrapped; 
    } 

    @Override 
    public ExceptionHandler getExceptionHandler() { 
     return new YourAjaxExceptionHandler(getWrapped().getExceptionHandler()); 
    } 

    @Override 
    public ExceptionHandlerFactory getWrapped() { 
     return wrapped; 
    } 

} 

faces-config.xmlに工場等の通常の方法でそれを登録:

<factory> 
    <exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-handler-factory> 
</factory> 
+0

あなたは良い紳士と学者です!どうもありがとう。 – blo0p3r

+0

@BalusC 'MyAjaxExceptionHandler#logException'にスイッチがありません。この行はelse内にある必要があります: 'super.logException(context、exception、location、message、parameters);'。また、faces-config.xml ' 'がcom.example.MyAjaxExceptionHandlerFactoryである必要があります。 –

+0

@Patrick:回答が更新されました。ありがとう! – BalusC

関連する問題