Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 升级到Roboguice 3后,注入的对象变为空_Java_Android_Dependency Injection_Roboguice - Fatal编程技术网

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

Java 升级到Roboguice 3后,注入的对象变为空,java,android,dependency-injection,roboguice,Java,Android,Dependency Injection,Roboguice,我刚刚将我们的项目升级为使用Roboguice 3,突然所有注入的对象都变成了null,包括POJO、提供者、视图、资源等,我正在努力找出原因 首先是gradle构建文件,尝试了打开和关闭Proguard,但没有任何区别。我相信我们目前正在使用Roboguice 3.0.1,但我尝试了3.0,仍然存在问题 compile ('org.roboguice:roboguice:3.+') { exclude module: 'asm' } provided 'org.roboguice:ro

我刚刚将我们的项目升级为使用Roboguice 3,突然所有注入的对象都变成了null,包括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"/>
这是关于它的设置,我们没有改变任何东西,如果我使用Roboguice 2,一切正常

我还尝试了其他几件事:

  • 在没有Roboblender和annotation db的情况下也进行了尝试
    RoboGuice.setUseAnnotationDatabases(false)这没什么区别
  • Ln.d(“测试”+Strings.toString(0))这个日志打印得很好,所以我认为实际的库是正确打包的
  • 我没有注入POJO的提供者,而是尝试像下面这样使用手动注入
    RoboGuice.getInjector(this.getInstance(SharedReferencesHelper.class))并引发有关
    在some.path.SharedReferencesHelper中找不到合适的构造函数的错误。类必须有一个(并且只有一个)用@Inject注释的构造函数,或者一个非私有的零参数构造函数。
    奇怪的是,在SharedReferencesHelper类中,我们确实有一个带有
    @Inject
    注释的公共构造函数,我想不知何故,它没有被考虑进去?也许整个问题都是因为没有考虑注释

  • 几天来,我一直在用我的头撞击它,如果有任何输入或更多的东西可以尝试,我将不胜感激。

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

    static {
        RoboGuice.setUseAnnotationDatabases(false);
    }
    
    AnnotationDatabaseImpl类由Roboblender在编译时生成

    使注释数据库正常工作:

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

    对于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>
    
    
    org.apache.maven.plugins
    maven编译器插件
    ${maven compiler.version}
    -AguiceAnnotationDatabasePackageName=some.package.name.here
    ${java.version}
    ${java.version}
    真的
    

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

    <meta-data android:name="roboguice.annotations.packages" android:value="some.package.name.here"/>
    
    
    
    如果您进行了这些更改并且正在使用intellij,那么重新导入Maven pom将应用这些更改。或者,在Intellij中,您可以指定一个编译器参数来获取要创建的注释

    这将在Settings/Build、Executions、Deployment/Java编译器中的其他命令行参数下进行

    -AguiceAnnotationDatabasePackageName=some.package.name.here


    希望这能帮到你并帮你省去一些痛苦:)

    我在gradle和Android Studio中使用它时也会遇到同样的错误

    我在build.gradle文件中添加了以下内容:

    allprojects {
        gradle.projectsEvaluated {
            tasks.withType(JavaCompile) {
                options.compilerArgs << "-AguiceAnnotationDatabasePackageName=com.android.app.sample"
            }
        }
    }
    
    所有项目{
    gradle.项目评估{
    tasks.withType(JavaCompile){
    
    options.compilerArgs可以通过正确地传递上下文来解决此问题。如果要扩展应用程序类,请使用roboguice注入上下文,然后在注入POJO时将上下文传递给它们

    这对我有用


    --Shiv

    以上内容似乎适用于具有构建风格的项目。已过时。
    allprojects {
        gradle.projectsEvaluated {
            tasks.withType(JavaCompile) {
                options.compilerArgs << "-AguiceAnnotationDatabasePackageName=com.android.app.sample"
            }
        }
    }
    
    <meta-data android:name="roboguice.annotations.packages" android:value="com.android.app.sample"/>