我有一个CustomExceptionHandler,我希望使用Primefaces对话框框架从中显示一个模态对话框以从用户那里获取一些信息。
当我故意导致空指针异常时,正在按预期调用CustomExceptionHandler#handle
方法。如果我从xhtml页面上的p:commandButton的actionListener直接调用它(在启用和禁用ajax的情况下),我可以显示对话框的.xhtml页面并与之交互。
当我在导致NPE的页面上调用ap:commandButton(禁用ajax以消除可能的ajax错误使场景变得复杂)时,从CustomExceptionHandler#handle
生成日志消息之前/之后,但是对话框页面不显示。然而,窗口闪烁,就像它被刷新一样。
来自CustomExceptoinHandler.java:
public class CustomExceptionHandler
extends ExceptionHandlerWrapper
{
private ExceptionHandler wrapped;
public CustomExceptionHandler(ExceptionHandler wrapped)
{
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped()
{
return wrapped;
}
@Override
public void handle()
throws FacesException
{
Iterator<ExceptionQueuedEvent> iterator = getUnhandledExceptionQueuedEvents().iterator();
while (iterator.hasNext()) {
boolean removeError = false;
Throwable t = iterator.next().getContext().getException();
while (t.getCause() != null)
t = t.getCause();
if (t instanceof NullPointerException) {
Logging.devLogger.warn("NPE exception handler before dialog");
Map<String, Object> options = new HashMap<>();
options.put("modal", true);
String page = "/home/dialogs/exceptionDialog.xhtml";
RequestContext.getCurrentInstance().openDialog(page, options, null);
Logging.devLogger.warn("NPE exception handler after dialog");
removeError = true;
} // TBD: other cases and refactoring ....
if (removeError) iterator.remove();
}
getWrapped().handle();
}
}
RequestContext....openDialog()
调用在处理异常时以及通过commandButton直接打开对话框时是相同的。我已确定在异常情况之外打开对话框时构造异常对话框(视图作用域)的辅助bean,但在处理异常时未打开构造(未调用@PostConstruct方法)。< / p>
如何更改处理异常的方式,以便对话框按预期运行?我使用的是Mojarra 2.2.5,Primefaces 4.0,Glassfish 4.0。
答案 0 :(得分:0)
我正在使用PrimeFaces 5.2,我已经用其他方式解决了这个问题。
要显示对话框,我在名为&#34; errorDialog &#34;的模板中创建了错误对话框。并通过我的 CustomExceptionHandler 显示它我已经使用过,这个命令
RequestContext.getCurrentInstance().execute("PF('errorDialog').show();");
您无法使用以下命令,因为已经存在异常,因此您可以呈现对话框。
RequestContext.getCurrentInstance().openDialog(page, options, null);
关于 @PostConstruct 方法的异常处理,我使用过:
@PostConstruct
private void init() {
try {
initController();
} catch (Exception ex) {
logger.error(ex, null);
//Show the error dialog
MyUtil.openErrorDialog();
}
}
注意我还有一个问题,当异常(错误500)发生并由 App Server 处理而不是我的 CustomHandlerClass ,我无法显示对话框,因为App Server已经有重定向。