Обработка исключений в запросах ajax JSF

Как обработать исключение и получить доступ к трассировке стека при вызове исключения при обработке запроса ajax JSF? Прямо сейчас, я получаю только имя и сообщение класса исключения в уведомлении JavaScript, когда для этапа проекта JSF установлено значение "Разработка". Хуже того, нет визуальной обратной связи, когда на этапе проекта JSF устанавливается "Производство", а в журнале сервера не отображается информация об исключении.

Если это актуально, я использую GlassFish в Netbeans.

Ответ 1

Эта проблема известна и, в частности, представлена ​​OmniFaces FullAjaxExceptionHandler витрина.

В принципе, вам нужно создать пользовательский 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>

См. также: