7

そのため、恐ろしいことに直面した後javax.faces.application.ViewExpiredException、適切な解決策を見つけるためにインターネットを見回さなければなりませんでした. 幸いなことに、ソリューションはすぐに利用できるので、私は OmniFaces の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 に出力されないようにする方法はありますか? これにより、ログがすぐにいっぱいになります。

私は実行しています:
Mojarra 2.1.23
PrimeFaces 4.0-SNAPSHOT
OmniFaces 1.6-SNAPSHOT-2013-07-01


Glassfish 3.1.2.2で

4

1 に答える 1

7

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);
        }
    }

}

その周りにファクトリを作成します。

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、通常の方法でファクトリとして登録します ( の元の登録を削除することを忘れないでくださいFullAjaxExceptionHandlerFactory)。

<factory>
    <exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-handler-factory>
</factory>
于 2013-08-02T12:53:52.343 に答える