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

时间:2014-12-08 21:43:33

标签: java android dependency-injection roboguice

我刚刚将项目升级为使用Roboguice 3,突然间所有注入的对象都变为空,包括POJO,提供者,视图,资源等等。我正在努力弄清楚原因。

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

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

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

<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和注释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,我想不知何故它没有被考虑?也许整个问题是由于没有考虑注释?
  4. 我现在已经开始反对它几天了,非常感谢任何输入或更多的东西尝试。

3 个答案:

答案 0 :(得分:4)

将此添加到应用程序类将解决当前问题。如果添加到默认启动活动,它也应该有效。

static {
    RoboGuice.setUseAnnotationDatabases(false);
}

AnnotationDatabaseImpl类由Roboblender在编译时生成。

获取注释数据库:

编译器参数&#34; guiceAnnotationDatabasePackageName&#34;决定生成的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>

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

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

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

这将在Settings / Build,Executions,Deployment / Java Compiler

中的附加命令行参数下进行

<强> -AguiceAnnotationDatabasePackageName = some.package.name.here

希望这会有所帮助并为您节省一些悲伤:)

答案 1 :(得分: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"/>

答案 2 :(得分:-3)

可以通过正确传递上下文来解决问题。如果要扩展应用程序类,然后使用roboguice注入上下文,然后在注入POJO时,则在其中传递上下文。

这对我有用。

- 希夫