0

I cannot make Guice Multibindings work with RoboGuice.

When my activity extends android Activity, multibindings work just fine. When my activity extends RoboActivity, multibindings do not work, and the following exception is thrown:

3450-3450/com.example.guicetest E/AndroidRuntime﹕ FATAL EXCEPTION: main
com.google.inject.ProvisionException:
Unable to provision, see the following errors:
1) Multibinder is not initialized
at com.example.guicetest.MainActivity$1$1.configure(MainActivity.java:35)
(via modules: com.example.guicetest.MainActivity$1$1 ->
com.google.inject.multibindings.Multibinder$RealMultibinder)
while locating java.util.Set<com.example.guicetest.MyInterface>
for parameter 0 at com.example.guicetest.MyFooService.<init>(Unknown Source)
while locating com.example.guicetest.MyFooService
1 error
at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1018)
at com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1044)
at com.example.guicetest.MainActivity$1.onClick(MainActivity.java:41)

Android Studio project I've created declares following Gradle dependencies:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.google.guava:guava:18.0'
    compile 'com.android.support:appcompat-v7:22.0.0'
    compile('com.google.inject.extensions:guice-multibindings:4.0-beta5') {
        exclude group: 'com.google.inject', module: 'guice'
    }
    compile('org.roboguice:roboguice:3.0.1') {
        exclude group: 'com.google.inject', module: 'guice'
    }
    provided('org.roboguice:roboblender:3.0.1') {
        exclude group: 'com.google.inject', module: 'guice'
    }
}

The module is as follows (part of MainActivity):

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
     Injector injector = Guice.createInjector(new AbstractModule() {
                @Override
                protected void configure() {
                    bind(MyFooService.class).in(Singleton.class);
                    Multibinder<MyInterface> processors = Multibinder.newSetBinder(binder(), MyInterface.class);
                    processors.addBinding().to(MyBarImpl.class);
                    processors.addBinding().to(MyQuxImpl.class);
                }
            });

            MyFooService fooService =injector.getInstance(MyFooService.class);
            Log.d("TEST", String.valueOf(fooService.implementations.size()));
        }
    });

If I invoke 'gradle -q :app:dependencies' I receive:

compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:22.0.0
|    \--- com.android.support:support-v4:22.0.0
|         \--- com.android.support:support-annotations:22.0.0
+--- com.google.inject:guice:3.0
|    \--- javax.inject:javax.inject:1
+--- com.google.inject.extensions:guice-multibindings:3.0
\--- org.roboguice:roboguice:3.0.1

but still I've got dalvik error:

com.android.dex.DexException: Multiple dex files define Lcom/google/inject/Module;

When I test 'guice-3.0-no_aop' library, 'com.google.inject.Module' class is both in 'guice-3.0-no_aop' and 'roboguice-3.0.1'.

I'm pretty stuck here :)

diego
  • 1
  • 2

1 Answers1

0

I've made it. It turns out, at least for me, that Multibindings work only with Roboguice 2. My Gradle configuration that finally worked:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile ('com.android.support:appcompat-v7:22.0.0'){
        exclude group: 'com.google.inject', module: 'guice'
    }
    compile(group: 'com.google.inject', name: 'guice', version: '3.0', classifier: 'no_aop')
    compile('com.google.inject.extensions:guice-multibindings:3.0') {
       exclude group: 'com.google.inject', module: 'guice'
    }
    compile('org.roboguice:roboguice:2.0') {
        exclude group: 'com.google.inject', module: 'guice'
    }
}

I'd be truly grateful if someone could comment on using Multibindings with higher Roboguice versions...

diego
  • 1
  • 2