Bill Lucy created MYFACES-4353:
----------------------------------

             Summary: PreDestroy method (still) not invoked on 
javax.faces.bean.ViewScoped beans on Session invalidation
                 Key: MYFACES-4353
                 URL: https://issues.apache.org/jira/browse/MYFACES-4353
             Project: MyFaces Core
          Issue Type: Bug
    Affects Versions: 2.3.6, 2.2.13
            Reporter: Bill Lucy
            Assignee: Bill Lucy


 

It seems to me that the issue reported in 
https://issues.apache.org/jira/browse/MYFACES-4047 wasn't fixed completely.  
I'm currently looking at a scenario with a basic javax.faces.bean.ViewScoped 
bean and a short session timeout: @PostConstruct is invoked as expected, 
however @PreDestroy is not invoked when the backing session is invalidated via 
a timeout.  @PreDestroy is invoked correctly in the normal non-timeout cases, 
and it's also invoked on session timeout for CDI javax.faces.view.ViewScoped 
beans.

This gets into how ManagedBeanDestroyer.sessionDestroyed() is implemented:

[https://github.com/apache/myfaces/blob/2.2.x/impl/src/main/java/org/apache/myfaces/webapp/ManagedBeanDestroyerListener.java#L121]

if we don't have an active FacesContext when we get the sessionDestroyed() 
event, then we create a new StartupServletExternalContextImpl and pass that to 
the current ViewScopeProvider.  That's a problem: the non-CDI ViewScopeProvider 
needs to be able to get at the session from the external context, and 
StartupServletExternalContextImpl is implemented such that it always returns 
null for getSession() and getSessionMap().  So in this case the non-CDI 
DefaultViewScopeProvider will never clean up or call PreDestroy on the 
ViewScoped beans.

My idea for a fix is to allow an HtppSession to be set on the 
StartupServletExternalContextImpl.  I'll attach a PR shortly.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to