Hi,
Given a simple @Stateless bean:
@Stateless
public class Foo {
public void bar() {}
}
Then requesting an instance of this via CDI as follows:
Foo foo = CDI.current().select(Foo.class).get();
Only the following throws an UnsupportedOperationException (on Weld 2.3.2, haven't tested OWB yet)
Instance<Foo> fooInstance = CDI.current().select(Foo.class);
Foo foo = fooInstance.get();
foo.bar();
fooInstance.destroy(foo);
The question is, is this how it's supposed to be done via the spec?
Implementation wise, what happens in Weld is that the CDI/EJB proxy (com.test.Foo$Proxy$_$$_Weld$EnterpriseProxy$) in the following code doesn't hit the check for a dependent instance (comments in capitals added by me):
public void destroy(T instance) {
Preconditions.checkNotNull(instance);
// check if this is a proxy of a normal-scoped bean
if (instance instanceof ProxyObject) {
// THIS BRANCH IS TAKEN FOR CDI/EJB PROXY
ProxyObject proxy = (ProxyObject) instance;
if (proxy.getHandler() instanceof ProxyMethodHandler) {
ProxyMethodHandler handler = (ProxyMethodHandler) proxy.getHandler();
Bean<?> bean = handler.getBean();
Context context = getBeanManager().getContext(bean.getScope());
if (context instanceof AlterableContext) {
AlterableContext alterableContext = (AlterableContext) context;
// CONTEXT IS A DEPENDENTCONTEXTIMPL THAT THROWS
// UnsupportedOperationException FROM ITS DESTROY() METHOD
alterableContext.destroy(bean);
return;
} else {
throw BeanLogger.LOG.destroyUnsupported(context);
}
}
}
// check if this is a dependent instance
CreationalContext<? super T> ctx = getCreationalContext();
if (ctx instanceof WeldCreationalContext<?>) {
WeldCreationalContext<? super T> weldCtx = cast(ctx);
// PROXY REFERENCES ARE KEPT HERE IN A
// "dependentInstances" LIST, AND WOULD BE CLEARED HERE
// BUT THIS CODE IS NEVER REACHED
weldCtx.destroyDependentInstance(instance);
}
}
Now I wonder, am I doing something wrong (according to the CDI spec), or could this be a bug in the Weld code?
Kind regards,
Arjan Tijms