[weld-dev] Not possible to destroy normal scoped beans returned by producer method

arjan tijms arjan.tijms at gmail.com
Thu Sep 15 02:59:45 EDT 2016


Hi,

The produced Foo should have been used before it's destroyed, but I'll
double check it's also used right before the destroy method is called in
the same thread. I'll try to make a simple reproducer as well if it still
doesn't work correctly then.

Kind regards,
Arjan Tijms

On Thu, Sep 15, 2016 at 8:48 AM, Martin Kouba <mkouba at redhat.com> wrote:

> Hi Arjan,
>
> a simple reproducer would be helpful. There are few edge cases around
> session context and HTTP session which are problematic (e.g.
> HttpSession.invalidate()).
>
> Do you call some method on the produced Foo before you call destroy?
> Because in Weld, normal scoped instances are created lazily and so does the
> HTTP session in case of @SessionScoped.
>
> Thanks,
>
> Martin
>
> Dne 14.9.2016 v 19:14 arjan tijms napsal(a):
>
>> Hi,
>>
>> I have a simple producer:
>>
>> @Produced
>> @SessionScoped
>> public void Foo getFoo() { return new Foo());
>>
>> If I subsequently want to destroy the Bean using:
>>
>> Set<Bean<?>> beans = beanManager.getBeans(Foo.class);
>>
>> Bean<?> bean = (Bean<T>) beanManager.resolve(beans);
>> Context context = beanManager.getContext(bean.getScope());
>>
>> ((AlterableContext) context).destroy(bean);
>>
>> Then in Weld 2.3.2 the destroy method of the super class
>> of org.jboss.weld.context.http.HttpSessionContextImpl is called:
>>
>> org.jboss.weld.context.AbstractContext
>>
>> Containing this code:
>>
>>     @Override
>>     public void destroy(Contextual<?> contextual) {
>>         if (!isActive()) {
>>             throw new ContextNotActiveException();
>>         }
>>         checkContextInitialized();
>>         if (contextual == null) {
>>             throw ContextLogger.LOG.contextualIsNull();
>>         }
>>         final BeanStore beanStore = getBeanStore();
>>         if (beanStore == null) {
>>             throw ContextLogger.LOG.noBeanStoreAvailable(this);
>>         }
>>         BeanIdentifier id = getId(contextual);
>>         ContextualInstance<?> beanInstance = beanStore.remove(id);
>>         if (beanInstance != null) {
>>             RequestScopedCache.invalidate();
>>             destroyContextualInstance(beanInstance);
>>         }
>>     }
>>
>> Now the getBeanStore() method
>> (from org.jboss.weld.context.AbstractBoundContext) returns an
>> org.jboss.weld.context.beanstore.http.LazySessionBeanStore and this bean
>> store does *not* contain the Foo bean (no key for its BeanIdentifier).
>> There are other session scoped beans there that have been instantiated
>> for the test, but Foo is missing.
>>
>> If subsequently the session is destroyed, the same destroy method is
>> called on the
>> org.jboss.weld.context.http.HttpSessionContextImpl eventually, but now
>> the getBeanStore() method returns
>> an org.jboss.weld.context.beanstore.http.EagerSessionBeanStore, and this
>> one *does* contain the Foo bean.
>>
>> The other beans that the EagerSessionBeanStore contain are equal to the
>> ones in the LazySessionBeanStore, the only difference is the Foo bean.
>>
>> Is this a bug in Weld or am I doing something wrong?
>>
>> Kind regards,
>> Arjan Tijms
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> weld-dev mailing list
>> weld-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/weld-dev
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/weld-dev/attachments/20160915/74ca151b/attachment.html 


More information about the weld-dev mailing list