我试图通过抽象类ExceptionHandlerWrapper
和ExceptionHandlerFactory
的专门化来实现JSF中全局异常处理的机制。但是,当在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>
爪哇:
@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。
答案 0 :(得分:1)
我有完全相同的问题(渲染阶段的LazyDataModel +异常)。试试Mojarra 2.1.16或更高版本。 见http://java.net/jira/browse/JAVASERVERFACES-2179
答案 1 :(得分: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>