2014-12-08 3 views
5

Я только что обновил наш проект, чтобы использовать Roboguice 3, и внезапно все введенные объекты стали нулевыми, включая POJO, Providers, Views, Resources и т. Д. И я пытаясь понять, почему.Введенные объекты стали нулевыми после обновления до Roboguice 3

Прежде всего, есть файл построения градиента, он попытался включить и выключить Proguard, и это не повлияло. Я считаю, что мы в настоящее время используем Roboguice 3.0.1, но я пробовал 3.0 и все еще имел проблему.

compile ('org.roboguice:roboguice:3.+') { 
    exclude module: 'asm' 
} 
provided 'org.roboguice:roboblender:3.+ 

И у нас есть некоторые пользовательские привязки в файле модуля, так вот как я указать его в соответствии с вики:

<meta-data 
    android:name="roboguice.modules" 
    android:value="com.some.CustomModule"/> 

Только для записи я также попытался указать это в классе Application, как это и это не сработало:

RoboGuice.getOrCreateBaseApplicationInjector(
        this, 
        RoboGuice.DEFAULT_STAGE, 
        RoboGuice.newDefaultRoboModule(this), 
        new CustomModule(this)); 

Вот об этом для настройки, мы не изменили ничего, и если я использую Roboguice 2, все работает.

Пару других вещей, которые я также пытался:

  1. Также попытался без Roboblender и аннотаций дб RoboGuice.setUseAnnotationDatabases(false); она не делает разницы.
  2. Ln.d("Test" + Strings.toString(0)); эти журналы печатаются просто отлично, поэтому я думаю, что фактическая библиотека упакована правильно.
  3. Вместо введение поставщика в POJO, я пытался использовать ручную инъекцию, как этот RoboGuice.getInjector(this).getInstance(SharedPreferencesHelper.class); и бросает ошибку о Could not find a suitable constructor in some.path.SharedPreferencesHelper. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. Странное является то, что в классе SharedPreferencesHelper у нас есть публичный конструктор с @Inject аннотированным, я думаю, как-то это не принимаются во внимание? Может быть, вся эта проблема связана с тем, что аннотация не рассматривается?

Я уже несколько дней стучал головой об этом, и был бы очень признателен за любые материалы или все, что можно было бы попробовать.

ответ

4

Добавление этого в класс приложения решит немедленную проблему. Он также должен работать, если добавить к активности запуска по умолчанию.

static { 
    RoboGuice.setUseAnnotationDatabases(false); 
} 

Класс AnnotationDatabaseImpl генерируется Roboblender во время компиляции.

Получение базы данных аннотаций работы:

Компилятор аргумент «guiceAnnotationDatabasePackageName» решает, что пакет сгенерированный класс AnnoationsDatabaseImpl присваивается.

Для мавена сборки:

<plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>${maven-compiler.version}</version> 
       <configuration> 
        <compilerArgument>-AguiceAnnotationDatabasePackageName=some.package.name.here</compilerArgument> 
        <source>${java.version}</source> 
        <target>${java.version}</target> 
        <fork>true</fork> 
       </configuration> 

Затем в манифесте приложения, внутри элемента приложения добавить мета-тег данных, который ссылается на сгенерированный класс.

<meta-data android:name="roboguice.annotations.packages" android:value="some.package.name.here"/> 

Если вы внесете эти изменения и используете intellij, то повторное импортирование вашего Maven pom применит эти изменения.Кроме того, в Intellij вы можете назначить аргумент компилятора для создания аннотации.

Это гибнуть Дополнительные параметры командной строки в меню Настройки/сборка, Казни, развертывание/Java Compiler

-AguiceAnnotationDatabasePackageName = some.package.name.here

Надеется, что это помогает и спасает некоторые горе :)

3

я получаю ту же ошибку при ее использовании с Gradle и Android Studio

Я добавил следующее в файл build.gradle:

allprojects { 
    gradle.projectsEvaluated { 
     tasks.withType(JavaCompile) { 
      options.compilerArgs << "-AguiceAnnotationDatabasePackageName=com.android.app.sample" 
     } 
    } 
} 

Добавлено следующее AndroidManifest.xml:

<meta-data android:name="roboguice.annotations.packages" android:value="com.android.app.sample"/> 
+0

Выше, похоже, работает для проектов со сборными ароматами. [RoboGuice wiki] (https://github.com/roboguice/roboguice/wiki/RoboBlender-wiki) устарел. – Diederik

-3

Проблема может быть решена путем передачи в контексте должным образом. Если вы расширяете класс приложения, введите Inject Context с помощью roboguice, а затем, когда вы вводите POJO, передайте в них контекст.

Это сработало для меня.

--Shiv