Я натягиваю на это волосы и знаю, что это обсуждалось здесь миллионы раз .. после прочтения десятков вопросов здесь относительно этой темы c и попытки их .. результат все тот же, это исключение не обрабатывается и не перенаправляется на мою пользовательскую страницу ошибок.
Итак, сначала я добавил это в свою сеть. xml
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/errorpages/expired.xhtml</location>
</error-page>
и создал эту простую страницу ошибок в пути /errorpages/expired.x html
<ui:composition
template="/templates/common/base.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
<ui:define name="title">DeviceRepair - Sesja Wygasła</ui:define>
<ui:define name="metas">
<meta http-equiv="refresh" content="0;url=#{request.contextPath}/login.xhtml" />
</ui:define>
<ui:define name="content">
<h1>Sesja wygasła..</h1>
<h3>Zostaniesz wkrótce przekierowany do strony logowania.</h3>
<p><a href="#{request.contextPath}/login.xhtml">
Naciśnij tutaj jeżelili przekierowanie nie zaskoczyło lub jeżeli jesteś niecierpliwy
<!--Click here if redirect didn't work or when you're impatient-->
</a>.</p>
</ui:define>
</ui:composition>
Это не сработало .. поэтому я создал пользовательский обработчик исключений, как показано ниже: factory
public class ExceptionHandlerFactory extends javax.faces.context.ExceptionHandlerFactory {
private javax.faces.context.ExceptionHandlerFactory parent;
public ExceptionHandlerFactory(javax.faces.context.ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
ExceptionHandler result = parent.getExceptionHandler();
result = new ViewExpiredExceptionHandler(result);
return result;
}
}
и пользовательский класс-оболочку
publi c class ViewExpiredExceptionHandler расширяет ExceptionHandlerWrapper {
private ExceptionHandler parent;
public ViewExpiredExceptionHandler(ExceptionHandler parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getWrapped() {
return this.parent;
}
@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;
FacesContext facesContext = FacesContext.getCurrentInstance();
Map<String, Object> requestMap = facesContext.getExternalContext()
.getRequestMap();
NavigationHandler navigationHandler = facesContext.getApplication()
.getNavigationHandler();
try {
// Push some useful stuff to the request scope for use in the page
requestMap.put("currentViewId", vee.getViewId());
navigationHandler.handleNavigation(facesContext, null, "/errorpages/expired");
facesContext.renderResponse();
} finally {
i.remove();
}
}
}
// At this point, the queue will not contain any ViewExpiredEvents.
// Therefore, let the parent handle them.
getWrapped().handle();
}
}
и помещает это в face-config. xml
<factory>
<exception-handler-factory>
pl.blabla.devicerepair.exception.ExceptionHandlerFactory
</exception-handler-factory>
</factory>
Тогда это все еще не работает, поэтому я добавил это в сеть. xml
<context-param>
<param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
<param-value>false</param-value>
</context-param>
Все тот же результат, поэтому изменил javax.faces.PROJECT_STAGE в сети. xml с разработки на производство .. и он просто съел ошибку без перенаправления .. так еще хуже.
я проверьте это, установив это в моем вебе. xml
<session-config>
<session-timeout>
1
</session-timeout>
</session-config>
и после запуска веб-приложения просто подождите 2 минуты и нажмите какую-нибудь командную кнопку. Спасибо за любую помощь.