I have a simple producer:

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:


Containing this code:

    public void destroy(Contextual<?> contextual) {
        if (!isActive()) {
            throw new ContextNotActiveException();
        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) {

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