Can you expand a little more on what you're using your TypeListener & InjectionListener for? TypeListener doesn't work so well for knowing what objects will be bound -- it misses things like scope that can be set in the module (and not on the class). InjectionListener also doesn't work very well -- it only notifies about objects that are injected, not objects that are bound (but not yet injected).
It sounds like you may be looking for something like a binding listener. See patch # 387 @ http://code.google.com/p/google-guice/issues/detail?id=387. Sam On Sun, Aug 9, 2009 at 7:51 AM, Jean-Francois Poilpret <[email protected]>wrote: > > Hello, > > in GUTS-Events I am using Guice TypeListener (and InjectionListener) in > order to process annotations of Guice-injected objects. > But my TypeListener itself requires some service, which is created by > Guice (and I need it injected by Guice then). > Unfortunately, Guice Binder.bindListener() only takes a TypeListener > instance and never ever tries to inject its dependencies. > > I have tried to circumvent this Guice limitation by explicitly requiring > to inject the TypeListener instance with binder.requestInjection(). > This works in some situations but not all. This morning I have faced a > new situation where this crashed, this happened because my TypeListener > instance was injected AFTER another Guice-injected object which was > passed to my (incomplete) TypeListener for processing. > > Here is a small test case I have written (I made it as simple as I > could) that shows my problem: > > @Test public class TypeListenerProblemTest > { > public void checkTypeListenerIsInjected() > { > final InjectedMain main = new InjectedMain(); > // Create Guice injector > Injector injector = Guice.createInjector(new AbstractModule() > { > @Override protected void configure() > { > InjectedTypeListener typeListener = new > InjectedTypeListener(); > requestInjection(typeListener); > Matcher<TypeLiteral<?>> matcher = new > AbstractMatcher<TypeLiteral<?>>() > { > public boolean matches(TypeLiteral<?> type) > { > return > (type.getRawType().equals(InjectedMain.class)); > } > }; > bindListener(matcher, typeListener); > bind(InjectedMain.class).toInstance(main); > bind(String.class).toInstance("Dummy"); > } > }); > } > > static public class InjectedTypeListener implements TypeListener > { > public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> > encounter) > { > assert _something != null; > } > @Inject String _something; > } > > static public class Dependency > { > } > > static public class InjectedMain > { > @Inject Dependency _dependency; > } > } > > This a TestNG test case, but it is easily adaptable to JUnit, or even no > test lib at all (as a main class). > The interesting stuff is the module configure() content and the > InjectedTypeListener implementation. The assert in hear() will always > throw! > > Now my question is: how can I circumvent this problem? I would be glad > to hear ideas to dig further because I feel a little bit lost now. > > Cheers > > Jean-Francois > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "google-guice" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/google-guice?hl=en -~----------~----~----~----~------~----~------~--~---
