В моем приложении пользователь должен быть перенаправлен на пользовательскую страницу ошибок, когда выдается определенное исключение.
Страница с ошибкой отображается, но URL-адрес не меняется на местоположение страницы с ошибкой.
Ниже приведены соответствующие фрагменты кода.
внутри моего web.xml у меня есть следующие объявления.
<error-page>
<exception-type>de.mmo.base.util.login.NoSidException</exception-type>
<location>/error/NoActiveSID.xhtml</location>
</error-page>
<error-page>
<exception-type>de.mmo.exceptions.NotLoggedInException</exception-type>
<location>/error/NotLoggedInExc.xhtml</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/error404.xhtml</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/error500.xhtml</location>
</error-page>
В моих Faces-config.xml я попробовал следующие два объявления
<factory>
<exception-handler-factory>
org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory
</exception-handler-factory>
</factory>
и
<factory>
<exception-handler-factory>
de.mmo.test.MyExceptionHandlerFactory
</exception-handler-factory>
</factory>
Когда я пытался использовать MyExceptionHandler, я прокомментировал FullAjaxExceptionHandlerFactory.
Ниже приведен код MyExceptionHandler.
public class MyExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public MyExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
ExceptionHandler result = parent.getExceptionHandler();
result = new MyExceptionHandler(result);
return result;
}
}
public class MyExceptionHandler extends FullAjaxExceptionHandler {
private ExceptionHandler wrapped;
public MyExceptionHandler(ExceptionHandler wrapped) {
super(wrapped);
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return this.wrapped;
}
@Override
protected String findErrorPageLocation(FacesContext context,
Throwable exception) {
System.out.println("inside my findErrorPageLocation");
if(exception instanceof NoSidException) {
System.out.println("inside exception instanceof NoSidExceptin");
return "/error/NoActiveSID.xhtml?faces-redirect=true";
} else {
return super.findErrorPageLocation(context, exception);
}
}
И последнее, что у меня есть, например. класс NoSidExceptino
public class NoSidException extends FacesException {
private static final long serialVersionUID = -2350480134523249331L;
public NoSidException(){
super ("ACHTUNG: SID ist abgelaufen !");
}
}
Все страницы ошибок находятся в файлах webapp --> error --> *.xhtml.
Мое приложение работает на сервере Glassfish.
Если вам нужна дополнительная информация, я сообщу им :)
спасибо за помощь
----------РЕДАКТИРОВАТЬ--------------------------------------- ------------------------
Я смог решить свою проблему с помощью javascript.
В заголовок страницы с ошибкой вставляю
<script type="text/javascript">
$(document).load(function() {
redirectToErrorPage ();
});
</script>
А в теле у меня есть remoteCommand
<h:form>
<p:remoteCommand name="redirectToErrorPage" action="#{nav.baueNavPfad(pfadKonst.ERROR_NOSID, false)}">
</p:remoteCommand>
</h:form>