2017-05-08 46 views
3

我遇到了与Guice一起工作的空值问题。 Nex我给你看一个类似场景的例子。 我知道字段注入是一个不好的做法,但我希望它是这样工作了演示Guice字段注入不起作用(返回null)

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

class B{ 

    @Inject 
    public B(){} 

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

我有一个名为一个抽象类,其中具有类(一个我想通过字段喷射来喷射):

abstract class A{ 

    @Inject 
    protected B b; 

} 

现在命名为Ç延伸一个另一个具体类:

class C extends A{ 

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

我吉斯配置如下:

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

你是怎么创建'C'的? –

+0

您的ConfigModule出现并不重要,可以使用B的'@Inject'构造函数将其删除。如果B是必需的但没有限制,Guice不会失败,所以要同意Tavian,它真的归结于你如何从Guice获得C。我会通过一种方法假设'@提供'一个新的C()',或者让Guice完全离开它的某种方式。 –

+0

嗨,大家好,我已经更新了更多的细节问题,我喜欢编辑 –

回答

3

这是什么扔你关:

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

删除它。实际上,删除整个模块 - 您定义的任何方法都不会帮助您进行注射。


当你创建一个@Provides C方法,吉斯假设你正在创建Ç只是你喜欢的方式,并且将不填充@Inject -annotated领域或致电@Inject -annotated方法。但是,当C有一个@Inject -annotated或public argumentless构造函数时,Guice将检查该对象并根据其@Inject字段和方法创建它,这是您要查找的行为。

+0

谢谢@Jeff Bowman!你知道更多关于Guice的资源吗?这很有趣,但我发现它很难... –