Обработка исключений в JSF ajax-запросах
Как мне обработать исключение и получить доступ к трассировке стека при возникновении исключения во время обработки AJAX-запроса JSF? Прямо сейчас я получаю имя класса исключения и сообщение в предупреждении JavaScript только тогда, когда этап проекта JSF установлен на Разработка. Хуже того, визуальная обратная связь вообще отсутствует, когда на этапе проекта JSF установлено значение "Производство", а в журнале сервера не отображается информация об исключении.
Если это актуально, я использую GlassFish в Netbeans.
1 ответ
Эта проблема известна и уточнена среди прочих в OmniFacesFullAjaxExceptionHandler
витрина
В основном вам нужно создать кастомExceptionHandler
как стандарт JSF не предоставляет один из коробки (по крайней мере, не разумный). В этом вы сможете достатьException
экземпляр вызывает все неприятности.
Вот начальный пример:
public class YourExceptionHandler extends ExceptionHandlerWrapper {
private ExceptionHandler wrapped;
public YourExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public void handle() throws FacesException {
FacesContext facesContext = FacesContext.getCurrentInstance();
for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) {
Throwable exception = iter.next().getContext().getException(); // There it is!
// Now do your thing with it. This example implementation merely prints the stack trace.
exception.printStackTrace();
// You could redirect to an error page (bad practice).
// Or you could render a full error page (as OmniFaces does).
// Or you could show a FATAL faces message.
// Or you could trigger an oncomplete script.
// etc..
}
getWrapped().handle();
}
@Override
public ExceptionHandler getWrapped() {
return wrapped;
}
}
Чтобы запустить его, создайтеExceptionHandlerFactory
следующее:
public class YourExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public YourExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
return new YourExceptionHandler(parent.getExceptionHandler());
}
}
Который должен быть зарегистрирован в faces-config.xml
следующее:
<factory>
<exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-handler-factory>
</factory>