升级到Roboguice 3后,注入的对象变为null

vic*_*217 5 java android dependency-injection roboguice

我刚刚升级了我们的项目以使用Roboguice 3,突然间所有注入的对象都变为null,包括POJO,Providers,Views,Resources等.我正在努力弄清楚原因.

首先是gradle构建文件,试用Proguard开启和关闭它并没有什么区别.我相信我们目前正在使用Roboguice 3.0.1,但我尝试了3.0并仍然遇到了问题.

compile ('org.roboguice:roboguice:3.+') {
    exclude module: 'asm'
}
provided 'org.roboguice:roboblender:3.+
Run Code Online (Sandbox Code Playgroud)

我们在模块文件中有一些自定义绑定,所以这是我如何根据wiki指定它:

<meta-data
  android:name="roboguice.modules"
  android:value="com.some.CustomModule"/>
Run Code Online (Sandbox Code Playgroud)

只是为了记录我还尝试在这样的Application类中指定它并且它不起作用:

RoboGuice.getOrCreateBaseApplicationInjector(
                    this,
                    RoboGuice.DEFAULT_STAGE,
                    RoboGuice.newDefaultRoboModule(this),
                    new CustomModule(this));
Run Code Online (Sandbox Code Playgroud)

这是关于它的设置,我们没有改变任何东西,如果我使用Roboguice 2,一切正常.

我还尝试了其他一些事情:

  1. 也尝试没有Roboblender和注释db 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注释的公共构造函数,我想不知何故它没有被考虑在内?也许整个问题是由于没有考虑注释?

我已经对它进行了几天的撞击,并且非常感谢任何输入或更多的东西尝试.

mjs*_*tam 4

将其添加到应用程序类将解决眼前的问题。如果添加到默认启动活动中,它也应该可以工作。

static {
    RoboGuice.setUseAnnotationDatabases(false);
}
Run Code Online (Sandbox Code Playgroud)

AnnotationDatabaseImpl 类由 Roboblender 在编译时生成。

让注释数据库正常工作:

编译器参数“guiceAnnotationDatabasePackageName”决定将生成的 AnnoationsDatabaseImpl 类分配给哪个包。

对于 Maven 构建:

<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>
Run Code Online (Sandbox Code Playgroud)

然后在应用程序清单中的应用程序元素内添加引用生成的类的元数据标记。

<meta-data android:name="roboguice.annotations.packages" android:value="some.package.name.here"/>
Run Code Online (Sandbox Code Playgroud)

如果您进行这些更改并使用 intellij,则重新导入 Maven pom 将应用这些更改。或者,在 Intellij 中,您可以分配一个编译器参数来获取要创建的注释。

这将位于“设置/构建、执行、部署/Java 编译器”中的“附加命令行参数”下

-AguiceAnnotationDatabasePackageName=some.package.name.here

希望这对您有所帮助并减轻您的悲伤:)