我已经阅读了问题Handle ViewExireException/ajax and display a Primefaces dialog以及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();
}
问题是,我从NullPointerException
处理程序执行handle方法时得到wrapped
。我添加了return子句,添加后,效果是一样的:
[30.01.13 15:45:59:140 CET] 0000002e ErrorPageWrit E异常 发生了 javax.faces.FacesException:java.lang.NullPointerException at org.apache.myfaces.shared_impl.context.ExceptionHandlerImpl.wrap(ExceptionHandlerImpl.java:241)at 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.4 和 MyFaces 2.0.7 , WebSphere 7 上的所有内容。
我不明白这里发生了什么。是否有可能实现我想要的,如果是,我做错了什么?
答案 0 :(得分:2)
最好的方法是在客户端处理该异常。这是非常简单的几行,它完全透明:
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
更改,这就是我喜欢的编程。