-
1. Re: Don't disposes instances from programmatic lookup ?
meetoblivion Mar 7, 2010 7:04 AM (in response to wildes)what scope are your beans?
-
2. Re: Don't disposes instances from programmatic lookup ?
nickarls Mar 7, 2010 8:01 AM (in response to wildes)The lifecycle is the same no matter how it's obtained, it comes from a context and goes down with a context (regardless of scope). Could you show the entire bean code?
-
3. Re: Don't disposes instances from programmatic lookup ?
wildes Mar 8, 2010 12:54 PM (in response to wildes)Yes, it is a simple test, one requestScoped backingbean that require a connection from an actionEvent.
...@Named @RequestScoped public class SampleController { private Connection connection = null; @Inject private Instance<Connection> connectionProducer = null; public void doAnything(){ connection = connectionProducer.get(); } } ... @Named @ApplicationScoped public class ConnectionProducer implements Serializable { ... @Produces public Connection getConnection() throws SQLException { return dataSource.getConnection(); } }
-
4. Re: Don't disposes instances from programmatic lookup ?
nickarls Mar 8, 2010 1:19 PM (in response to wildes)And you have a @Disposes annotation parameter in a method in ConnectionProducer that isn't called? And you are sure you have the CDI scope annotations and not the JSF ones?
-
5. Re: Don't disposes instances from programmatic lookup ?
wildes Mar 8, 2010 1:34 PM (in response to wildes)yes, i sure. And when i change the injection strategy to inject annotation on a connection field, i can see the disposes.
//imports on backing bean import javax.enterprise.context.RequestScoped; import javax.enterprise.inject.Any; import javax.enterprise.inject.Instance; import javax.inject.Inject; import javax.inject.Named; ... // Disposer method on ConnectionProducer public void closeConnection(@Disposes Connection connection) throws SQLException { connection.close(); }
-
6. Re: Don't disposes instances from programmatic lookup ?
nickarls Mar 8, 2010 4:52 PM (in response to wildes)no method invocation = no instance = no disposal?
-
7. Re: Don't disposes instances from programmatic lookup ?
wildes Mar 8, 2010 5:56 PM (in response to wildes)The method disposer is not called if an instance is obtained from a programmatic lookup. Do anyone can reproduce this scenario ?
-
8. Re: Don't disposes instances from programmatic lookup ?
nickarls Mar 8, 2010 9:12 PM (in response to wildes)public class Data { public void ping() { }; }
public class DataContainer { @Inject @Important Instance<Data> data; public void ping() { data.get().ping(); } }
public class Producer { public static boolean disposed = false; @Produces @RequestScoped @Important Data produceData() { return new Data(); } public void disposeData(@Disposes @Important Data data) { Producer.disposed = true; } }
@Test public void works() { DataContainer dataContainer = getReference(DataContainer.class); dataContainer.ping(); getCurrentManager().getServices().get(ContextLifecycle.class).getRequestContext().destroy(); assert Producer.disposed; }
works for me
-
9. Re: Don't disposes instances from programmatic lookup ?
nickarls Mar 8, 2010 9:42 PM (in response to wildes)Tried @Produces @ApplicationScoped?
-
10. Re: Don't disposes instances from programmatic lookup ?
wildes Mar 8, 2010 9:54 PM (in response to wildes)I observed now that my producer method is bound to dependent scope. If i change to requestScoped its works. Strange that the disposal works when direct inject on field, and programmatically not. The weld-reference doc says about dependent scope that
It is strictly a dependent object of some other object. It is instantiated when the object it belongs to is created, and destroyed when the object it belongs to is destroyed
. What is the correct disposal behaviour from producers bound to dependent scope ? Can you try again with producer method bound to dependent scoped ?Thanks.
-
11. Re: Don't disposes instances from programmatic lookup ?
nickarls Mar 8, 2010 10:18 PM (in response to wildes)I came up with https://jira.jboss.org/jira/browse/WELD-466
It appears as the disposer is resolved fine but it is never called when the parent bean is destroyed since the Instance<Foo> is not correctly registered as a dependent to the parent bean, it appears.
Which matches both our observations.