在tomcat7上使用mojarra 2.1.27和richfaces 4.3.6,我试图为ajax请求实现自己的异常处理程序(遵循所有建议),但我永远无法访问渲染异常。
我有通过web.xml <error-page>
指令处理的正常回发异常,它工作正常,并且ajax请求应该通过我的自定义处理程序。这似乎在更新值和调用操作时有效,但在渲染阶段没有异常。
拥有这个简单的ajax命令按钮
<a4j:commandButton execute="@this" action="#{testController.actionButton4}"
render="@form" value="Ajax Post + Render Error"/>
其中(以及其他)呈现带有结果的div
<div id="result">
#{testController.result}
</div>
由TestController
public String actionButton4() {
result = "action4";
inError = true;
return null;
}
在渲染过程中使用的简单getter。
public String getResult() {
if (inError) {
inError = false;
throw new RuntimeException("Render error in " + result);
}
return result;
}
我的处理程序或多或少地执行默认行为
public void handle() throws FacesException {
dohandle();
getWrapped().handle();
}
public void dohandle() throws FacesException {
FacesContext fc = FacesContext.getCurrentInstance();
PhaseId phaseId = fc.getCurrentPhaseId();
boolean partialRequest = fc.getPartialViewContext().isPartialRequest();
boolean ajaxRequest = fc.getPartialViewContext().isAjaxRequest();
Iterator<ExceptionQueuedEvent> iterator = getUnhandledExceptionQueuedEvents().iterator();
log.trace("Phase id ({})", phaseId);
while (iterator.hasNext()) {
log.trace("Request is partial ({}). Request is ajax ({})", partialRequest, ajaxRequest);
if (!ajaxRequest) {
return;
}
...
}
}
我在渲染过程中看到的是richfaces的ExtendedPartialViewcontextImpl中的日志记录异常
Jun 25, 2014 10:18:44 AM org.richfaces.context.ExtendedPartialViewContextImpl$RenderVisitCallback logException
SEVERE: /test2.xhtml: Error reading 'result' on type c.n.g.w.controller.TestController
...
然后我看到阶段结束并且咨询了异常处理程序
10:18:44.336 {http-bio-8080-exec-2} TRACE c.n.g.w.generic.LifeCycleListener - END PHASE RENDER_RESPONSE 6
10:18:44.336 {http-bio-8080-exec-2} TRACE c.n.g.w.generic.ExceptionHandler - Phase id (RENDER_RESPONSE 6)
但由于某种原因,队列中没有未处理的异常。
我找不到任何说明RF渲染应该与其他人有任何不同的反应,但我怀疑它可能是。有没有人比我更了解?
更新
我从客户端日志中注意到渲染的输出在EL标记处被剪切,因此渲染会因某种原因而中断并提交部分结果。