如何将Primefaces对话框(对话框框架)显示为CustomExceptionHandler的一部分

时间:2014-03-17 13:31:49

标签: jsf primefaces dialog custom-exceptions

我有一个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。

1 个答案:

答案 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已经有重定向。