gpt4 book ai didi

java - 升级到 Roboguice 3 后注入(inject)的对象变为空

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:44:30 25 4
gpt4 key购买 nike

我刚刚将我们的项目升级为使用 Roboguice 3,突然之间所有注入(inject)的对象都变为空,包括 POJO、提供者、 View 、资源等。我正在努力找出原因。

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

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

而且我们在模块文件中确实有一些自定义绑定(bind),所以这里是我根据 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 和注释数据库 RoboGuice.setUseAnnotationDatabases(false);这没有什么不同。
  2. Ln.d("Test" + Strings.toString(0));这个日志打印得很好,所以我认为实际的库打包正确。
  3. 我没有注入(inject) POJO 的提供者,而是尝试像这样使用手动注入(inject) 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 的公共(public)构造函数。注释,我想不知何故它没有被考虑在内?也许这整个问题是由于未考虑注释造成的?

几天来我一直在努力解决这个问题,非常感谢任何输入或更多尝试。

最佳答案

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

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>

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

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

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

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

-AguiceAnnotationDatabasePackageName=some.package.name.here

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

关于java - 升级到 Roboguice 3 后注入(inject)的对象变为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27367525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com