TypeListener does not detect Map instance

38 views
Skip to first unread message

Pablo perez

unread,
Apr 23, 2016, 1:44:05 PM4/23/16
to google-guice

I´m using Guice TypeListener to intercept a map instance generated by a provider.

Here the config method where I bind my listener

@Override
public void addConfig() {
    MapListener mapListener = new MapListener();
    requestInjection(mapListener);
    bindListener(Matchers.any(), mapListener);
}

This is the map instance created by this provider

  @Provides
  Map<String, String> mapTest(){
    return new HashMap<>();
  }

This is the listener class to detect the map instance

public class MapListener implements TypeListener {

    @Override
    public <I> void hear(final TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) {
        typeEncounter.register((InjectionListener<I>) i -> {
        if(i.getClass().isAssignableFrom(Map.class)){
              System.out.println("DI:"+ i.getClass()
                                .getName());
             //TODO:Logic to modify map
        }
        });
    }
}

The problem is the Map is never passed to the hear method. Am I doing something wrong?

Regards.

Stephan Classen

unread,
Apr 23, 2016, 4:52:59 PM4/23/16
to google...@googlegroups.com
You canot intercept methods on instances created by a provider. What guice does is to create a subclass of the thing you want to to intercept. But when you use a provider to create this object you are calling new yourself which makes it impossible for guice to sneak in the subclass.

Therefore interception of methods only works on instances created by guice (there is no 'new' in your code)

Pablo perez

unread,
Apr 23, 2016, 6:30:47 PM4/23/16
to google-guice
So, If I understand what you said, Guice can only provide in the filter those instance created by itself, like through @injected or created through Factories. 

Stephan Classen

unread,
Apr 23, 2016, 6:46:48 PM4/23/16
to google...@googlegroups.com
Yes. Guice can only provide the filter if guice created the instance. It does not work for instances created by your own code or for instances created by providers you have written.

Pablo perez

unread,
Apr 24, 2016, 8:16:13 AM4/24/16
to google-guice
thanks for the answer. To make it works I create a Factory class and I create the map instance using it, so then is guice which is creating the instance therefore I can filter it already.

install(new FactoryModuleBuilder().build(MapFactory.Factory.class));

public static class MapFactory<K, V> extends HashMap<String, String> {

public interface Factory {
MapFactory <String, String> create();
}
}

MapFactory.Factory mapFactory

Map<String, String> map =mapFactory.create();

What do you think?. Do you know if there´s a better or standard way to do it?

Regards.

Sam Berlin

unread,
Apr 24, 2016, 8:28:54 AM4/24/16
to google-guice

You can use ProvisonListener to intercept the provision (@Provides, Provider.get, or constructor) of any binding.

sam


--
You received this message because you are subscribed to the Google Groups "google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-guice...@googlegroups.com.
To post to this group, send email to google...@googlegroups.com.
Visit this group at https://groups.google.com/group/google-guice.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-guice/717b6c94-658a-48ec-87c9-51ad9a488a7a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages