2013-07-29 1 views
0

Я использую ConversatonScoped bean как мой бэк-компонент JSF. Иногда URL будет иметь? Cid = XX. Тем не менее, это обычно вызывает проблемы при истечении срока действия компонента, связанного с сеансом. Он показывает ошибку 500 в браузере и org.jboss.weld.context.ContextNotActiveException в журнале сервера. Я поместил следующее в мой web.xmlКак обрабатывать истекший разговор с помощью cid в URL-адресе?

<error-page> 
    <exception-type>org.jboss.weld.context.ContextNotActiveException</exception-type> 
    <location>/faces/index.xhtml</location> 
</error-page> 
<error-page> 
    <error-code>500</error-code> 
    <location>/faces/index.xhtml</location> 
</error-page> 

Это не сработало. Когда url имеет неправильный cid, он показывает ошибку 500. Как я могу это исправить?

ответ

1

Вы можете создать свой собственный «ViewExpiredExceptionHandler» и перенаправить на нужную страницу.

Что-то, как это должно работать:

import java.util.Iterator; 
import org.jboss.weld.context.NonexistentConversationException; 

import javax.faces.FacesException; 
import javax.faces.application.ViewExpiredException; 
import javax.faces.context.ExceptionHandler; 
import javax.faces.context.ExceptionHandlerWrapper; 
import javax.faces.context.FacesContext; 
import javax.faces.event.ExceptionQueuedEvent; 
import javax.faces.event.ExceptionQueuedEventContext; 

public class ViewExpiredExceptionHandler 
     extends ExceptionHandlerWrapper { 

    private ExceptionHandler wrapped; 

    public ViewExpiredExceptionHandler(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 
        || t instanceof NonexistentConversationException) { 

       FacesContext fc = FacesContext.getCurrentInstance(); 
       try { 

        if (!fc.getExternalContext().isResponseCommitted()) { 
         fc.getExternalContext().redirect("index.xhtml"); 
        } 
        fc.renderResponse(); 
        break; 
       } catch (Exception ex) { 
        throw new FacesException(ex); 
       } finally { 
        i.remove(); 
       } 
      } 
     } 
     getWrapped().handle(); 
    } 
} 

Создать ViewExpiredExceptionHandlerFactory как это:

import javax.faces.context.ExceptionHandler; 
import javax.faces.context.ExceptionHandlerFactory; 

public class ViewExpiredExceptionHandlerFactory 
    extends ExceptionHandlerFactory { 

    private ExceptionHandlerFactory parent; 

    public ViewExpiredExceptionHandlerFactory(
      ExceptionHandlerFactory parent) { 
     this.parent = parent; 
    } 

    @Override public ExceptionHandler getExceptionHandler() { 

     ExceptionHandler result = parent.getExceptionHandler(); 
     result = new ViewExpiredExceptionHandler(result);  
     return result; 
    } 
} 

Добавьте это в faces-config.xml:

<factory> 
    <exception-handler-factory> 
     com.yourcode.ViewExpiredExceptionHandlerFactory 
    </exception-handler-factory> 
</factory>  
Смежные вопросы