MultiBindings Guice Extensions не работает с RoboActivity

Я не могу заставить Guice Multibindings работать с RoboGuice.

Когда моя активность расширяет активность Android, мультипривязки работают нормально. Когда моя активность расширяет RoboActivity, мультипривязки не работают, и возникает следующее исключение:

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 объявляет следующие зависимости Gradle:

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'
    }
}

Модуль выглядит следующим образом (часть 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()));
        }
    });

Если я вызываю 'gradle -q:app:dependencies', я получаю:

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

но все же у меня есть ошибка dalvik:

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

Когда я тестирую библиотеку guice-3.0-no_aop, класс com.google.inject.Module находится как в guice-3.0-no_aop, так и в roboguice-3.0.1.

Я довольно застрял здесь :)


person diego    schedule 26.04.2015    source источник
comment
Можете ли вы включить свой модуль, а также?   -  person durron597    schedule 27.04.2015
comment
Вероятно, это потому, что вы смешиваете Guice 3 с Guice 4.   -  person Tavian Barnes    schedule 27.04.2015
comment
@diego Я уверен, что у вас есть модуль как анонимный класс в com.example.guicetest.MainActivity; Я могу сказать по вашей трассировке стека исключений.   -  person durron597    schedule 27.04.2015
comment
@diego Если вы хотите включить больше кода, отредактируйте его в исходном вопросе.   -  person durron597    schedule 27.04.2015
comment
@Tavian Barnes, если я переключаюсь на guice-multibindings:3.0, то получаю java.lang.NoClassDefFoundError: com/google/inject/internal/util/$ImmutableList от компилятора Android Studio.   -  person diego    schedule 28.04.2015
comment
Кто-нибудь? Я единственная организация, которая безуспешно пытается заставить RoboGuice и Multibindings работать вместе?   -  person diego    schedule 28.04.2015


Ответы (1)


Я сделал это. Получается, по крайней мере для меня, что Multibindings работают только с Roboguice 2. Моя конфигурация Gradle, которая наконец-то заработала:

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'
    }
}

Я был бы очень признателен, если бы кто-нибудь мог прокомментировать использование Multibindings с более высокими версиями Roboguice...

person diego    schedule 03.05.2015