You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Bill Lucy (Jira)" <de...@myfaces.apache.org> on 2020/08/17 14:45:00 UTC

[jira] [Resolved] (MYFACES-4353) PreDestroy method (still) not invoked on javax.faces.bean.ViewScoped beans on Session invalidation

     [ https://issues.apache.org/jira/browse/MYFACES-4353?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Bill Lucy resolved MYFACES-4353.
--------------------------------
    Resolution: Fixed

> 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.2.13, 2.3.6, 3.0.0-RC1
>            Reporter: Bill Lucy
>            Assignee: Bill Lucy
>            Priority: Major
>
>  
> 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)