2012-06-11 4 views
1

Я пытаюсь кэшировать и обрабатывать viewExpiredexception, где, если «viewExpiredexceptionviewExpiredexception» является броском, я написал собственный обработчик обработчика viewExpiredexception, который, как предполагается, перенаправляет обратно на страницу, где выбрано Exception, i также вставьте логическое значение в сеанс, который используется на странице с кратким изображением, чтобы показать сообщение «страница была обновлена».Обработка viewExpiredexception путем перенаправления

Ниже соответствующая часть моего ViewExpiredException Handler:

 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 fc = FacesContext.getCurrentInstance(); 
        Map<String, Object> requestMap = fc.getExternalContext().getRequestMap(); 
        NavigationHandler nav = fc.getApplication().getNavigationHandler(); 
        try { 
         requestMap.put("currentViewId", vee.getViewId()); 
         HttpServletRequest orgRequest = (HttpServletRequest) fc.getExternalContext().getRequest(); 
         fc.getExternalContext().redirect(orgRequest.getRequestURI()); 
         Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap(); 
         sessionMap.put("refreshedMaxSesion",true); 
         fc.renderResponse(); 
        } 
        catch(IOException e){ } 
        finally { i.remove(); } 
       } 
      } 
      // here queue will not contain any ViewExpiredEvents, let the parent handle them. 
      getWrapped().handle(); 
     } 

и случай навигации

  <navigation-rule> 
       <navigation-case> 
       <from-outcome>/app/ord1</from-outcome> 
       <to-view-id>/jsp/orderHist.jsp</to-view-id> 
       <redirect /> 
       </navigation-case> 
      </navigation-rule> 

Я имел ограниченный успех с вышеизложенным, он будет работать в некоторых случаях, но и в других случаях страница не будет перенаправляться вообще. Он работает в основном в хроме, но в IE он вообще не работает.

Я попытался сделать несколько изменений, таких как использование

HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse(); 
     response.sendRedirect(vee.getViewId()); 

но я получаю страницы ошибок 500 с исключением говоря View must Exists... так я перестал экспериментировать, чтобы выяснить, что я делаю неправильно первым. Как может быть заархивирована эта цель кэширования ViewExpiredException и Redirectign обратно на страницу, где была заброшена ошибка?

Я нахожусь на myFaces (2.1.7) и richFaces (3.3.3). Спасибо

ответ

1

В MyFaces Community есть некоторая работа, чтобы обработать ViewExpiredException грациозным способом. Некоторые проблемы были решены в MyFaces Core (см. MYFACES-3530 и MYFACES-3531) Возможно, вам стоит попробовать последний снимок HERE.

Смежные вопросы