如何通过显示 JavaScript 警报来处理 ViewExpireException



我已经阅读了问题Handle ViewExireException/ajax并显示Primefaces对话框和BalusC的答案。我想通过显示带有刷新页面信息的警报来处理ViewExpiredException。我已经将BalusC的建议带到了用户RequestContext,以执行JavaScript,并且我已经删除了JSF重定向,因为我没有使用它:

@Override
public void handle() throws FacesException {
    for (Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); i.hasNext();) {
        ExceptionQueuedEvent event = i.next();
        ExceptionQueuedEventContext context = (ExceptionQueuedEventContext) event.getSource();
        Throwable t = context.getException();
        if (t instanceof ViewExpiredException) {
            ViewExpiredException vee = (ViewExpiredException) t;
            try {
                log.info("Catched ViewExpiredException for view {}", vee.getViewId());
                RequestContext.getCurrentInstance().execute("handleViewExpired("+vee.getViewId()+")");
                return;
            } finally {
                i.remove();
            }
        } 
    }
    // At this point, the queue will not contain any ViewExpiredEvents.
    // Therefore, let the parent handle them.
    getWrapped().handle();
}

问题是,从处理程序执行句柄方法时wrapped我遇到了NullPointerException。我添加了返回条款,添加后效果是一样的:

[30.01.13 15:45:59:140 CET] 0000002e 错误页面令状 E 一个异常 发生 javax.faces.FacesException: java.lang.NullPointerException at org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241) at org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.handle(ExceptionHandlerImpl.java:156) 在 my.project.web.handler.ViewExpiredExceptionExceptionHandler.handle(ViewExpiredExceptionExceptionHandler.java:59) 在 org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:191) 在 org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)

因此,执行父句柄方法,认为应该有从方法返回(记录信息字符串)。

我使用的是 PrimeFaces 3.4MyFaces 2.0.7,这是 WebSphere 7 上的所有内容。

我不明白这里发生了什么。是否有可能实现我想要的,如果是,我做错了什么?

最好的方法是在客户端处理该异常。这是非常简单的几行,它是完全透明的:

var originalPrimeFacesAjaxResponseFunction = PrimeFaces.ajax.AjaxResponse;
PrimeFaces.ajax.AjaxResponse = function(data, status, xhr) {
  var errorName = $(data.documentElement).find("error-name").text();
  if (errorName == 'javax.faces.application.ViewExpiredException') {
    alert('View has expired, redirection will follow');
    window.location.reload();
  } else {
    originalPrimeFacesAjaxResponseFunction.apply(this, arguments);
  }
};

服务器上没有 2 个新类,没有faces-config.xml更改,这就是我喜欢编程的原因。

相关内容

  • 没有找到相关文章

最新更新