2015-02-14 3 views
2

Я реализую ExceptionHandlerFactory для обработки непредвиденных ошибок в моем приложении после документации JSF 2.0 https://cwiki.apache.org/confluence/display/MYFACES/Handling+Server+Errors. Реализация хорошо работает для большинства сценариев. Однако, когда я отключу свою базу данных, произошло несколько ошибок, и инициализация генерирует несколько исключений для подключения, таких как java.sql.SQLException, исключения в спящем режиме, исключения для боба и т. Д. Метод handle() выполняется несколько раз и перенаправляется на страницу с ошибкой много раз. Код ручки ниже:Как справиться с несколькими неожиданными исключениями JSF?

public void handle() throws FacesException { 

    final Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator(); 
    while (i.hasNext()) { 
     ExceptionQueuedEvent event = i.next(); 
     ExceptionQueuedEventContext context = 
       (ExceptionQueuedEventContext) event.getSource(); 

     // get the exception from context 
     Throwable t = context.getException(); 

     final FacesContext fc = FacesContext.getCurrentInstance(); 
     final Map<String, Object> requestMap = fc.getExternalContext().getRequestMap(); 
     final NavigationHandler nav = fc.getApplication().getNavigationHandler(); 

     //here you do what ever you want with exception 
     try { 

      //log error ? 
      log.log(Level.SEVERE, "Critical Exception!", t); 

      //redirect error page 
      requestMap.put("exceptionMessage", t.getMessage()); 
      nav.handleNavigation(fc, null, "/error"); 
      fc.renderResponse(); 

      // remove the comment below if you want to report the error in a jsf error message 
      //JsfUtil.addErrorMessage(t.getMessage()); 

     } finally { 
      //remove it from queue 
      i.remove(); 
     } 
    } 
    //parent hanle 
    getWrapped().handle(); 
} 

Я вижу более 15 запросов к странице ошибок в консоли отладки Firefox. Каков наилучший способ предотвратить множественные перенаправления? Спасибо.

ответ

2

Вы действительно можете отправить только 1 ответ на запрос. Один из способов - просто заменить while на if и удалить все остальные исключения в другом while. В любом случае первое исключение представляет наибольший интерес. Все остальные исключения - это просто последствия.

if (i.hasNext()) { 
    // Original code here. 
} 

while (i.hasNext()) { 
    i.next(); 
    i.remove(); 
} 

Вы можете получить inspiration из FullAjaxExceptionHandler полезности библиотеки JSF OmniFaces.

Другой способ - собрать все исключения в каком-либо списке, а затем отобразить одну страницу с ошибкой, в которой вы представляете этот список в некотором итерационном компоненте соответственно (например, ui:repeat или h:dataTable).