2015-12-07 6 views
0

Я работаю над приложением JSF, которое использует всевозможные символы. У меня есть специальный класс обработчика исключений для всех запросов ajax путем расширения FullAjaxExceptionHandler и переопределения функции shouldHandleExceptionRootCause(). Здесь я добавляю свои бизнес-ошибки в контекст, и я должен отображать эти сообщения на страницах xhtml. вызовы ajax производятся от клиента, используя p: commandButton. Но значения, которые я устанавливаю в контексте из моего настраиваемого обработчика исключений, не отображаются на странице xhtml.Настроить FullAjaxExceptionHandler, чтобы отображать только сообщение лиц для определенных исключений

public class CustomExceptionHandler extends FullAjaxExceptionHandler { 

@Override 
protected boolean shouldHandleExceptionRootCause(FacesContext context, Throwable exception) { 

context.addMessage(null, FacesMessage); 
context.getApplication().getNavigationHandler().handleNavigation(context, null, null); 
context.getPartialViewContext().setRenderAll(true); 
context.renderResponse(); 
setRequest(request, baseRunTimeException); 
return false; 
} 
} 

Но сообщение, которое я добавляю в контексте не отображаются в р: Сообщения тег

Пожалуйста, дайте мне знать, если что-нибудь не так с этим подходом?

+0

Вы в основном отключите «FullAjaxExceptionHandler» и полностью выполняете свое задание, пытаясь вручную обработать навигацию и рендеринг. Вы не используете «FullAjaxExceptionHandler» разумным способом. Этот метод предназначен для возврата true/false в конкретный тип исключения и ничего более. Что именно вы хотите? Просто добавление исключения в качестве сообщения лиц? Если это так, используйте OmniFaces 'FacesMessageExceptionHandler' вместо этого. – BalusC

+0

Привет, я проверил FacesMessageExceptionHandler, но mysceanrio немного отличается, я не хочу отображать все Исключения как Сообщения, некоторые из них будут перенаправлены на другую страницу с ошибкой. Удастся ли это достичь этой функциональности? Если да, пожалуйста, предложите мне, как это сделать? – prabu

ответ

0

В соответствии с функциональными требованиями в свой комментарий,

я не хочу, чтобы отобразить все исключения, как сообщения, некоторые из них я перенаправляет на другую страницу ошибки.

На тех, которые вы хотели бы направить (не перенаправлять) на страницу ошибки, просто дайте shouldHandleExceptionRootCause() метод возвращения true и зарегистрировать те страницы, ошибка в web.xml обычным способом.

На тех, которые вы хотели бы показать как сообщение лиц, просто добавьте сообщение о желаемых лицах, а затем верните false.

В приведенном ниже примере предполагается, что вы хотите показать сообщение примерного пользовательского com.example.SystemException как сообщение лиц.

@Override 
protected boolean shouldHandleExceptionRootCause(FacesContext context, Throwable exception) { 
    if (exception instanceof SystemException) { 
     Messages.addGlobalError(exception.getMessage()); 
     return false; // Don't show error page, just stay in same page. 
    } 

    return true; // Show error page as usual for other exceptions. 
} 
+0

Проблема с shouldHandleExceptionRootCause заключается в том, что нет способа удалить исключение из очереди, и из-за этого он запутывается - поскольку исключение все еще находится в очереди событий. – prabu

+0

Проблема с shouldHandleExceptionRootCause заключается в том, что нет способа удалить исключение из очереди, и из-за этого он беспорядочен - поскольку исключение все еще находится в очереди событий. Таким образом, мы нашли работу вокруг, как переопределить ручку() также @Override public void handle() throws FacesException { . . . if (! ShouldHandleExceptionRootCause (контекст, исключение)) { \t unhandledExceptionQueuedEvents.remove(); \t getWrapped(). Handle(); \t возвращение; } } И я сделал все, что вы упоминали в shouldHandleExceptionRootCause() – prabu

+0

Я вижу, к чему вы клоните. Согласно [this commit] (https: // github.com/omnifaces/omnifaces/commit/fa74dcd67d30fb80539746a0445347c1a1a2e5bb) удаление исключения теперь выполняется перед методом 'shouldHandleExceptionRootCause()'. Он доступен в сегодняшнем [2.3-SNAPSHOT] (https://oss.sonatype.org/content/repositories/snapshots/org/omnifaces/omnifaces/2.3-SNAPSHOT/). Можете ли вы попробовать? – BalusC