3

ExceptionHandlerWrapper抽象クラスとの特殊化を通じて、JSFでグローバル例外処理のメカニズムを実装しようとしていExceptionHandlerFactoryます。ただし、JSFライフサイクルのレンダリング応答フェーズで例外がスローされた場合、例外はスタックされないため(Phase.queueExceptionが呼び出されることはありません)、特殊なクラスのハンドルメソッドにキャプチャされませんExceptionHandlerWrapper

次のコードフラグメントは、前述の問題が発生する状況をまとめたものです。

JSF:

<h:form id="formManterLider">
    <h:selectOneMenu>
        ...
        <p:ajax update=":formManterLider" listener="#{MB.atualizarListaLideresInstituicao}" />
        ...
    </h:selectOneMenu>

    <p:dataTable value="#{MB.lazyModel}" ... />
</h:form>

Java:

@ManagedBean
@ViewScoped
public class MB {
    ...
    private LazyDataModel<LiderVO> lazyModel = new LazyDataModel<LiderVO>() {
        @Override
        public List<LiderVO> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) {
            ...
            List<LiderVO> lista = consultarLideresCandidatos(getInstituicaoSelecionada(), first, pageSize); // throws a RuntimeException
            return lista;
        }
    };
}

h:selectOneMenuAJAXリクエストを介してコンポーネントの選択値を変更すると、問題が発生します。これは、ステートメントupdate=":formManterLider"によってloadレンダリング応答フェーズ中にメソッドconsultarLideresCandidatosが呼び出され、メソッド内で呼び出されるメソッドが。loadをスローするためRuntimeExceptionです。

を特殊化するクラスを使用して、レンダリング応答フェーズでスローされた例外を検出する方法を知りたいですExceptionHandlerWrapper

注:私はMojarra2.1.12とPrimefaces3.2を使用しています。

4

2 に答える 2

1

私はまったく同じ問題を抱えていました(LazyDataModel +レンダリング段階での例外)。Mojarra 2.1.16 以降を試してください。http://java.net/jira/browse/JAVASERVERFACES-2179を参照してください。

于 2013-01-09T08:31:22.323 に答える
0

レンダリング応答フェーズでスローされた例外を、ExceptionHandlerWrapper を特化したクラスを使用して検出する方法を知りたいです。

手がかりはありませんが、スタック トレースがダンプされる場所なので、サーバーのログで十分ではないでしょうか?

例外がスローされないようにする (そしてデータ テーブルのみを更新する) には、データ テーブルを直接更新できます。

<h:form id="formManterLider">
    <h:selectOneMenu>
        ...
        <p:ajax update=":formManterLider:datatable" listener="#{MB.atualizarListaLideresInstituicao}" />
        ...
    </h:selectOneMenu>

    <p:dataTable id="datatable" value="#{MB.lazyModel}" ... />
</h:form>
于 2012-12-12T13:51:37.717 に答える