3

我正在尝试通过抽象类ExceptionHandlerWrapperExceptionHandlerFactory. 但是,当在 JSF 生命周期的渲染响应阶段抛出异常时,它不会被堆叠(从不调用Phase.queueException),因此不会在专门化的类的handleExceptionHandlerWrapper方法中捕获。

以下代码片段总结了出现上述问题的情况。

JSF:

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

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

爪哇:

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

通过 AJAX 请求更改h:selectOneMenu组件中的选择值会触发该问题,因为该语句update=":formManterLider"会导致load在渲染响应阶段调用该方法consultarLideresCandidatos,而在该方法中调用的load方法会抛出一个RuntimeException.

我想知道如何使用专门的类来检测渲染响应阶段抛出的异常ExceptionHandlerWrapper

注意:我使用的是 Mojarra 2.1.12 和 Primefaces 3.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 回答