-
1. Re: Register Observer Programmatically using CDI?
nickarls Aug 11, 2010 1:34 AM (in response to paulmooney)Probably not in pure CDI but you might want be able to by casting to a Weld BeanManagerImpl. Never done it so I haven't checked if it's usable (resolving reset etc)
-
2. Re: Register Observer Programmatically using CDI?
paulmooney Aug 11, 2010 11:07 AM (in response to paulmooney)Thanks, I'll try out the BeanManagerImpl.addObserver() method. I'm okay with not going pure CDI, it just would have been a nice to have.
Now the challenge is going to be handling the lifecycle of these non-contextual/non-managed java objects I want to have observers for.
-
3. Re: Register Observer Programmatically using CDI?
swd847 Aug 11, 2010 8:46 PM (in response to paulmooney)There is also AfterBeanDiscovery.addObserverMethod()
-
4. Re: Register Observer Programmatically using CDI?
swiegersf.francois.swiegers.gmail.com Aug 17, 2010 4:09 AM (in response to paulmooney)Your use case statement is a bit vague, so this may not be what you are looking for, but it should be possible to add observers dynamically at runtime using a normal Observer pattern.
(warning, I'm coding out of my head so the below won't compile, but I hope you get the general idea).
Like so:
@ApplicationScoped public class Observer { private Set<Listener> myListeners ...; public void addSomeListener(Listener l) { myListeners.add(l); } public void afterEvent(@Observes SomeEvent event) { for (Listener l : myListeners) { //not thread safe! l.notify(event); } } }
Then add a observer dynamically:
public class SomeClass { @Inject Observer observer; public void readyToRegisterMyObserver() { observer.addSomeListener(new Listener() ...); } }
Of course, all the usual disclaimers regarding the fragile observer pattern applies.