Вопрос по exception-handling, jsf, web.xml – Зачем использовать JSF ExceptionHandlerFactory вместо перенаправления <error-page>?

24

ВсеExceptionHandlerFactory примеры, с которыми я сталкивался до сих пор, перенаправляют пользователя наviewExpired.jsf страница в случае, еслиViewExpiredException пойман:

<code>public class ViewExpiredExceptionExceptionHandler extends ExceptionHandlerWrapper {
    private ExceptionHandler wrapped;

    public ViewExpiredExceptionExceptionHandler(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) {
                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, "/viewExpired");
                    facesContext.renderResponse();
                } finally {
                    i.remove();
                }
            }
        }

        // At this point, the queue will not contain any ViewExpiredEvents. Therefore, let the parent handle them.
        getWrapped().handle();
    }
}
</code>

Мне кажется, что следующее простоеweb.xml Конфигурация в основном такая же и намного проще:

<code><error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/viewExpired.jsf</location>
</error-page>
</code>

Это вызывает вопрос - зачем использоватьExceptionHandlerFactory?

Код выше вашего? если нет, можете ли вы указать источник? Mindwin

Ваш Ответ

2   ответа
3

ViewExpiredException.

Если вы просто хотите отобразить страницу ошибки пользователя, вы можете сделать это, как вы сказали.

этосообщение показать вам, как программно перехватить ViewExpiredException и сделать что-нибудь хорошее с этим.

ссылка не работает, пожалуйста, добавьте рабочую ссылку,
23

Конкретный пример делает только одну полезную вещь: он сохраняет идентификатор представления в качестве атрибута запроса, чтобы вы могли использовать, например,

<h:link value="Go back to previous page" outcome="#{currentViewId}" />

Но это не очень полезно, так как необработанный URI запроса уже доступен<error-page>атрибут запроса по умолчаниюjavax.servlet.error.request_uri.

<h:outputLink value="#{requestScope['javax.servlet.error.request_uri']}">Go back to previous page</h:outputLink>

Однако одна вещь, что обычайExceptionHandler действительно полезно для того, что это позволяет вам иметь дело с исключениями во времяajax requests, По умолчанию они не имеют единой формы полезной обратной связи на стороне клиента. Только в Мохарре, где на стадии проекта установлено «Разработка» Вы увидите голое предупреждение JavaScript с сообщением об исключении. Но это так. В разделе «Производство» нет единой формы обратной связи. этап. С кастомомExceptionHandler вы сможете разобратьweb.xml чтобы найти местоположения страницы ошибки, создайте новыйUIViewRoot с этим и заставить JSF установить рендеринг ajax в@all.

Так,basically:

String errorPageLocation = "/WEB-INF/errorpages/500.xhtml";
context.setViewRoot(context.getApplication().getViewHandler().createView(context, errorPageLocation));
context.getPartialViewContext().setRenderAll(true);
context.renderResponse();

Смотрите также этот связанный вопрос:Как правильно обрабатывать исключения JSF 2.0 для компонентов AJAXified? и этот блог:Полный обработчик исключений Ajax.

@Tiny: вы можете расширить его. Смотрите также Javadoc. OverrideshouldHandleExceptionRootCause() возвращатьfalse (и добавить это роковое сообщение).
Может OmniFacesorg.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory использоваться вместе с обработкой исключений путем созданияExceptionHandlerFactory этот способ перенаправить на страницу (страницы) глобальной ошибки, когда создаются исключения, которые не должны переноситься этой фабрикой? В документации требуется только одна фабрика обработчиков исключений для каждого приложения & quot;There must be one ExceptionHandlerFactory instance per web application that is utilizing JavaServer Faces. This instance can be acquired, in a portable manner, by calling.& Quot; Кстати, это хорошо работает при перенаправлении на страницу с глобальной ошибкой.

Похожие вопросы