我使用ConversationScoped bean作为我的JSF支持bean。有时,网址会有?cid=XX。然而,当会话范围的bean过期时,这通常会导致问题。它在浏览器中显示了一个500错误,在服务器日志中显示了org.boss.weld.cext.ContextNotActiveException。我已将以下内容放入我的web.xml 中
<error-page>
<exception-type>org.jboss.weld.context.ContextNotActiveException</exception-type>
<location>/faces/index.xhtml</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/faces/index.xhtml</location>
</error-page>
它不起作用。当url有一个错误的cid时,它会显示500错误。我该怎么修?
您可以创建自己的"ViewExpiredExceptionHandler"并重定向到所需页面。
像这样的东西应该起作用:
import java.util.Iterator;
import org.jboss.weld.context.NonexistentConversationException;
import javax.faces.FacesException;
import javax.faces.application.ViewExpiredException;
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerWrapper;
import javax.faces.context.FacesContext;
import javax.faces.event.ExceptionQueuedEvent;
import javax.faces.event.ExceptionQueuedEventContext;
public class ViewExpiredExceptionHandler
extends ExceptionHandlerWrapper {
private ExceptionHandler wrapped;
public ViewExpiredExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return this.wrapped;
}
@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
|| t instanceof NonexistentConversationException) {
FacesContext fc = FacesContext.getCurrentInstance();
try {
if (!fc.getExternalContext().isResponseCommitted()) {
fc.getExternalContext().redirect("index.xhtml");
}
fc.renderResponse();
break;
} catch (Exception ex) {
throw new FacesException(ex);
} finally {
i.remove();
}
}
}
getWrapped().handle();
}
}
创建一个ViewExpiredExceptionHandlerFactory,如下所示:
import javax.faces.context.ExceptionHandler;
import javax.faces.context.ExceptionHandlerFactory;
public class ViewExpiredExceptionHandlerFactory
extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public ViewExpiredExceptionHandlerFactory(
ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override public ExceptionHandler getExceptionHandler() {
ExceptionHandler result = parent.getExceptionHandler();
result = new ViewExpiredExceptionHandler(result);
return result;
}
}
将其添加到您的faces-config.xml
:
<factory>
<exception-handler-factory>
com.yourcode.ViewExpiredExceptionHandlerFactory
</exception-handler-factory>
</factory>