当前位置: 首页 > 知识库问答 >
问题:

Guice字段注入不工作(返回null)

宋丰
2023-03-14

我在使用Guice时遇到空值问题。Nex我向您展示了一个类似场景的示例。我知道字段注入是一种不好的做法,但我希望它在演示中像这样工作

我有具体类命名为B(这是我要注入的一个):

class B{

    @Inject
    public B(){}

    public void fooMethod(){
        System.out.println("foo!")
    }
}

我有一个名为A的抽象类,它有类B(我想通过字段注入注入的那个):

abstract class A{

    @Inject
    protected B b;

}

现在是另一个扩展A的具体类C:

class C extends A{

    public void barMethod(){
        System.out.println("is b null? " + (b==null)); // is true
    }
}

我的GUI配置如下:

class ConfigModule extends AbstractModule {

    @Override
    protected void configure(){
        // bind(B.class) // I have also tried this
    }

    @Provides
    B getB(){
        return new B();
    }

    @Provides
    C getC(){
        return new C();
    }
}

然后我对斯波克进行了测试:

@UseModules(ConfigModule)
class Test extends Specification{

    @Inject
    public C c;

    def "test"() {
        // Here goes the test using:
        c.barMethod();
    }       
}

谢谢:)

共有1个答案

姜经武
2023-03-14

这就是让你失望的原因:

@Provides
C getC(){
    return new C();
}

删除它。删除整个模块,事实上,您定义的任何方法都不能帮助您的注入。

当您创建@Provides C方法时,Guice假设您正在以您喜欢的方式创建C,并且不会填充@Inject-带注释的字段或调用@Inject-带注释的方法。但是,当C具有@Inject-带注释或公共无参数构造函数时,Guice将检查对象并根据其@Inject字段和方法创建它,这是您正在寻找的行为。

 类似资料:
  • 主要内容:Google Guice 字段注入 示例,输出注入是将依赖注入对象的过程。字段注入用于将值对象设置为对对象字段的依赖。请参阅下面的示例。 Google Guice 字段注入 示例 创建一个名为 GuiceTester 的 Java 类。 GuiceTester.java 输出 编译并运行该文件,您将看到以下输出。

  • 为什么我不能使用“findOne()”只返回一个字段?在下面的代码中,所有字段都返回。我也尝试了“findOne()”,但仍然不起作用。有人能告诉我是我弄错了还是怎么回事吗? 在这种情况下,我只想返回“信息”字段 文档如下所示:

  • 我正在尝试使用Guice 3.0,它不会实例化工厂。 SSCCE代码: < code>BarImpl与< code>FooImpl非常相似。这里出了什么问题?还要注意,我在这里尝试了< code>@AssistedInject和< code>@Inject,两者都会导致错误。 输出: 请注意,第 9 行是对 的第一次调用的行

  • (子资源)再次基于构造函数中传入的用户实现为普通的Jersey类。 但是,我的子资源也需要访问字段(如或)。根据Jersey文档,字段不会为子资源注入,因为它们的生命周期未知(文档似乎是真的)。 这对我来说是非常不可原谅的:我真的需要访问这些值。 作为一种解决办法,我目前将这些值作为额外的构造函数参数传递给我的子资源,我认为这一切都不舒服。 我能以某种方式创建这些映射吗? 问题是,我不知道如何在G

  • 我正在使用Scala编写Play 2.5应用程序。我有下面这段代码: 我还有一个控制器,我也在其中注入了 BarRepository,但是通过构造函数,在 val a barRepository.bar= 的类 Foo 中,我得到一个 NullPointerException,一切都运行良好。有人可以帮助找出问题所在吗?是否禁止在案例类中使用注射?

  • 我正在使用 scala play 2.5,在尝试在我的一个控制器中注入对象时出现以下错误。我正在使用 play 给出的默认注入框架,即 Guice。 这是控制器: 以下是我想注入的服务: 这就是我使用它的方式: