[
https://issues.apache.org/jira/browse/MYFACES-4047?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15297416#comment-15297416
]
Leonardo Uribe commented on MYFACES-4047:
-----------------------------------------
I have tested the patch and I founded the PreDestroy is called more than once
in some situations.
For example, if there is a h:commandButton with an action that invalidates the
session, ViewScopeBeanHolder.destroyBeansOnPreDestroy() is called by the CDI
listener and then the beans are destroyed, but later on the same request when
the navigation takes place, viewMap.clear() is called, which at the same time
it calls ManagedBeanDestroyer and call PreDestroy again.
The problem is in this case the "storage" instance in ViewScopeCDIMap is not
cleared properly, so this instance is still used besides the instance were
discarded from ViewScopeBeanHolder.
The idea is when ManagedBeanDestroyer is called, since the session was already
invalidated, it should retrieve an empty map, which is correct.
I have fixed the problems anyway. I have also tested the sessionExpiration case
and the tests shows the preDestroy is being called correctly.
Thanks to Hank Ibell and Paul Nicolucci for contribute with this patch.
> @PreDestroy method not invokved on javax.faces.bean.ViewScoped beans on
> Session invalidation
> --------------------------------------------------------------------------------------------
>
> Key: MYFACES-4047
> URL: https://issues.apache.org/jira/browse/MYFACES-4047
> Project: MyFaces Core
> Issue Type: Bug
> Components: JSR-344
> Affects Versions: 2.2.10
> Reporter: Paul Nicolucci
> Priority: Minor
> Attachments: MYFACES-4047-2-UNTESTED-ONLY-DEFAULT-VIEWSCOPE.patch,
> myfaces-4047-with-cdi.patch, myfaces-4047.patch, myfaces-4047.patch
>
>
> Consider the following scenario:
> Bean1:
> @Named
> @ViewScoped (javax.faces.view.ViewScoped)
> Bean2:
> @ManagedBean
> @ViewScoped (javax.faces.bean.ViewScoped)
> When the session is invalidated the
> org.apache.myfaces.cdi.impl.CDIManagedBeanHandlerImpl.onSessionDestroyed()
> method is invoked. Here, MyFaces destroys all of the
> javax.faces.view.ViewScoped @Named beans and @PreDestroy is invoked on these
> beans. However, the @ManagedBean /ViewScoped bean does not have its
> @PreDestroy invoked.
> I believe this is because the assumption was made that if an Application is
> CDI enabled it will contain all CDI @Named beans and not any @ManagedBeans.
> There is also the DefaultViewScopeHandler which is not yet implemented for
> "onSessionDestroyed" that would be used in the case when CDI is not enabled,
> that is when only @ManagedBeans are contained in the application.
> I believe it is possible to update the CDIManagedBeanHandlerImpl to be aware
> of the ViewScoped ManagedBeans and destroy them onSessionDestroy first by
> just getting the viewMap and iterating over the entries as we do when the
> PreDestroyViewMapEvent is processed.
> I'd like to use this issue to resolve the problem in
> CDIManagedBeanHandlerImpl as well as implement onSessionDestroy in
> DefaultViewScopeHandler.java
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)