【问题标题】:Injected objects became null after upgrading to Roboguice 3升级到 Roboguice 3 后注入的对象变为空
【发布时间】:2014-12-08 21:43:33
【问题描述】:

我刚刚升级了我们的项目以使用 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 的 Provider,而是尝试使用像 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 的公共构造函数注释,我想不知何故没有考虑到它?也许这整个问题是由于没有考虑注释?

我已经为此苦苦挣扎了几天,非常感谢任何意见或更多尝试的东西。

【问题讨论】:

    标签: java android dependency-injection roboguice


    【解决方案1】:

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

    static {
        RoboGuice.setUseAnnotationDatabases(false);
    }
    

    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>
    

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

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

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

    这将位于 Settings/Build、Executions、Deployment/Java Compiler 中的 Additional command line parameters 下

    -AguiceAnnotationDatabasePackageName=some.package.name.here

    希望这对您有所帮助并减轻您的痛苦:)

    【讨论】:

      【解决方案2】:

      我在使用 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"/>
      

      【讨论】:

      • 以上内容似乎适用于具有构建风格的项目。 RoboGuice wiki 已过期。
      【解决方案3】:

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

      这对我有用。

      --Shiv

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-23
        • 1970-01-01
        相关资源
        最近更新 更多