i am having a problem with null values working with Guice. Nex I show you an example of a similar scenario. I know field injection is a bad practice, but I want it to work like this for a demo
I have concrete class named B (which is the one I want to inject):
class B{
    @Inject
    public B(){}
    public void fooMethod(){
        System.out.println("foo!")
    }
}
I have an abstract class named A, which has the class B (the one I want to inject by field injection):
abstract class A{
    @Inject
    protected B b;
}
Now another concrete class named C that extends A:
class C extends A{
    public void barMethod(){
        System.out.println("is b null? " + (b==null)); // is true
    }
}
My guice configuration is the following:
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();
    }
}
Then I have a test with Spock:
@UseModules(ConfigModule)
class Test extends Specification{
    @Inject
    public C c;
    def "test"() {
        // Here goes the test using:
        c.barMethod();
    }       
}
Thanks :)
This is what's throwing you off:
@Provides
C getC(){
    return new C();
}
Delete it. Delete the whole module, in fact—none of the methods you've defined are helping your injection.
When you create a @Provides C method, Guice assumes that you're creating C just the way you'd like it, and will not populate @Inject-annotated fields or call @Inject-annotated methods. However, when C has an @Inject-annotated or public argumentless constructor, Guice will inspect the object and create it according to its @Inject fields and methods, which is the behavior you're looking for.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With