Dagger 2 - Null Pointer in Field Injection
I am using dagger 2 for dependency injection and got stuck with field injection. Below is the complete scenario with code sample:
Let's say we have a class A which depends on a library B
class A {
@Inject
B b;
}
Module for B:
@Module
public class BModule {
@Provides
@Singleton
public B provideB() {
return new C.methodA();
// C - static class; C.methodA returns B
}
}
But when I try to use b
in class A then I get null pointer exception but if I do the same using constructor injection then it works perfectly.
I can assure that component and other dependencies are fine as the constructor part works correctly.
A is a dependency of some other class (let's call X) and A is being initialized using constructor injection (tested). Also, X is being injected as void inject(X x);
I have 2 questions:
- Is there anything I am missing out for field injection due to which it is not being injected?
- I am able to successfully compile the code and get runtime exception, but dagger2 is compile-time DI then why is it unable to catch this while compiling?
P.S.: I have just shared a part of the code as there are multiple dependencies, so just trying to explain the scenario. Let me know if the question/scenario is still unclear or needs more info.
Thanks.
java dependency-injection dagger-2 dagger dagger-android
add a comment |
I am using dagger 2 for dependency injection and got stuck with field injection. Below is the complete scenario with code sample:
Let's say we have a class A which depends on a library B
class A {
@Inject
B b;
}
Module for B:
@Module
public class BModule {
@Provides
@Singleton
public B provideB() {
return new C.methodA();
// C - static class; C.methodA returns B
}
}
But when I try to use b
in class A then I get null pointer exception but if I do the same using constructor injection then it works perfectly.
I can assure that component and other dependencies are fine as the constructor part works correctly.
A is a dependency of some other class (let's call X) and A is being initialized using constructor injection (tested). Also, X is being injected as void inject(X x);
I have 2 questions:
- Is there anything I am missing out for field injection due to which it is not being injected?
- I am able to successfully compile the code and get runtime exception, but dagger2 is compile-time DI then why is it unable to catch this while compiling?
P.S.: I have just shared a part of the code as there are multiple dependencies, so just trying to explain the scenario. Let me know if the question/scenario is still unclear or needs more info.
Thanks.
java dependency-injection dagger-2 dagger dagger-android
add a comment |
I am using dagger 2 for dependency injection and got stuck with field injection. Below is the complete scenario with code sample:
Let's say we have a class A which depends on a library B
class A {
@Inject
B b;
}
Module for B:
@Module
public class BModule {
@Provides
@Singleton
public B provideB() {
return new C.methodA();
// C - static class; C.methodA returns B
}
}
But when I try to use b
in class A then I get null pointer exception but if I do the same using constructor injection then it works perfectly.
I can assure that component and other dependencies are fine as the constructor part works correctly.
A is a dependency of some other class (let's call X) and A is being initialized using constructor injection (tested). Also, X is being injected as void inject(X x);
I have 2 questions:
- Is there anything I am missing out for field injection due to which it is not being injected?
- I am able to successfully compile the code and get runtime exception, but dagger2 is compile-time DI then why is it unable to catch this while compiling?
P.S.: I have just shared a part of the code as there are multiple dependencies, so just trying to explain the scenario. Let me know if the question/scenario is still unclear or needs more info.
Thanks.
java dependency-injection dagger-2 dagger dagger-android
I am using dagger 2 for dependency injection and got stuck with field injection. Below is the complete scenario with code sample:
Let's say we have a class A which depends on a library B
class A {
@Inject
B b;
}
Module for B:
@Module
public class BModule {
@Provides
@Singleton
public B provideB() {
return new C.methodA();
// C - static class; C.methodA returns B
}
}
But when I try to use b
in class A then I get null pointer exception but if I do the same using constructor injection then it works perfectly.
I can assure that component and other dependencies are fine as the constructor part works correctly.
A is a dependency of some other class (let's call X) and A is being initialized using constructor injection (tested). Also, X is being injected as void inject(X x);
I have 2 questions:
- Is there anything I am missing out for field injection due to which it is not being injected?
- I am able to successfully compile the code and get runtime exception, but dagger2 is compile-time DI then why is it unable to catch this while compiling?
P.S.: I have just shared a part of the code as there are multiple dependencies, so just trying to explain the scenario. Let me know if the question/scenario is still unclear or needs more info.
Thanks.
java dependency-injection dagger-2 dagger dagger-android
java dependency-injection dagger-2 dagger dagger-android
edited Nov 14 '18 at 19:47
divyum
asked Nov 14 '18 at 18:11
divyumdivyum
780818
780818
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
Field injection in dagger
is a bit more complicated than constructor injection. When you use constructor injection like this
class A {
@Inject
public A(B b) {}
}
and you have provider for class B
@Module
class DaggerModule {
@Provides
B provideB() {}
}
now dagger will know how to create instance of A
and pass it required constructor parameter. So everything is fine, compile successfully and works perfect.
But if we speak about field injection
class A {
@Inject
B b;
}
and have somewhere provider for B
, dagger can't know how to create A
instance and when inject b
property (in case of manually creating instance of A
by hand). To make it work you need write special method in component
@Component(DaggetModule.class)
interface DaggerComponent {
void inject(A a);
}
and somewhere in code
A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
After that b
property will be initialized and available for later usage. Hope, it's clear now how to make field injection work.
Thanks @ConstOrVar, I forgot to mention here that A is a dependency of some other class (let's call X) and A is being initialized correctly. Also, X is being initialized as you have suggested i.e. void inject(X x); I will update in the question as well.
– divyum
Nov 14 '18 at 19:44
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53306403%2fdagger-2-null-pointer-in-field-injection%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Field injection in dagger
is a bit more complicated than constructor injection. When you use constructor injection like this
class A {
@Inject
public A(B b) {}
}
and you have provider for class B
@Module
class DaggerModule {
@Provides
B provideB() {}
}
now dagger will know how to create instance of A
and pass it required constructor parameter. So everything is fine, compile successfully and works perfect.
But if we speak about field injection
class A {
@Inject
B b;
}
and have somewhere provider for B
, dagger can't know how to create A
instance and when inject b
property (in case of manually creating instance of A
by hand). To make it work you need write special method in component
@Component(DaggetModule.class)
interface DaggerComponent {
void inject(A a);
}
and somewhere in code
A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
After that b
property will be initialized and available for later usage. Hope, it's clear now how to make field injection work.
Thanks @ConstOrVar, I forgot to mention here that A is a dependency of some other class (let's call X) and A is being initialized correctly. Also, X is being initialized as you have suggested i.e. void inject(X x); I will update in the question as well.
– divyum
Nov 14 '18 at 19:44
add a comment |
Field injection in dagger
is a bit more complicated than constructor injection. When you use constructor injection like this
class A {
@Inject
public A(B b) {}
}
and you have provider for class B
@Module
class DaggerModule {
@Provides
B provideB() {}
}
now dagger will know how to create instance of A
and pass it required constructor parameter. So everything is fine, compile successfully and works perfect.
But if we speak about field injection
class A {
@Inject
B b;
}
and have somewhere provider for B
, dagger can't know how to create A
instance and when inject b
property (in case of manually creating instance of A
by hand). To make it work you need write special method in component
@Component(DaggetModule.class)
interface DaggerComponent {
void inject(A a);
}
and somewhere in code
A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
After that b
property will be initialized and available for later usage. Hope, it's clear now how to make field injection work.
Thanks @ConstOrVar, I forgot to mention here that A is a dependency of some other class (let's call X) and A is being initialized correctly. Also, X is being initialized as you have suggested i.e. void inject(X x); I will update in the question as well.
– divyum
Nov 14 '18 at 19:44
add a comment |
Field injection in dagger
is a bit more complicated than constructor injection. When you use constructor injection like this
class A {
@Inject
public A(B b) {}
}
and you have provider for class B
@Module
class DaggerModule {
@Provides
B provideB() {}
}
now dagger will know how to create instance of A
and pass it required constructor parameter. So everything is fine, compile successfully and works perfect.
But if we speak about field injection
class A {
@Inject
B b;
}
and have somewhere provider for B
, dagger can't know how to create A
instance and when inject b
property (in case of manually creating instance of A
by hand). To make it work you need write special method in component
@Component(DaggetModule.class)
interface DaggerComponent {
void inject(A a);
}
and somewhere in code
A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
After that b
property will be initialized and available for later usage. Hope, it's clear now how to make field injection work.
Field injection in dagger
is a bit more complicated than constructor injection. When you use constructor injection like this
class A {
@Inject
public A(B b) {}
}
and you have provider for class B
@Module
class DaggerModule {
@Provides
B provideB() {}
}
now dagger will know how to create instance of A
and pass it required constructor parameter. So everything is fine, compile successfully and works perfect.
But if we speak about field injection
class A {
@Inject
B b;
}
and have somewhere provider for B
, dagger can't know how to create A
instance and when inject b
property (in case of manually creating instance of A
by hand). To make it work you need write special method in component
@Component(DaggetModule.class)
interface DaggerComponent {
void inject(A a);
}
and somewhere in code
A a = new A();
DaggerComponent component = //TODO getDaggerComponent()
component.inject(a);
After that b
property will be initialized and available for later usage. Hope, it's clear now how to make field injection work.
answered Nov 14 '18 at 19:18
ConstOrVarConstOrVar
1,094149
1,094149
Thanks @ConstOrVar, I forgot to mention here that A is a dependency of some other class (let's call X) and A is being initialized correctly. Also, X is being initialized as you have suggested i.e. void inject(X x); I will update in the question as well.
– divyum
Nov 14 '18 at 19:44
add a comment |
Thanks @ConstOrVar, I forgot to mention here that A is a dependency of some other class (let's call X) and A is being initialized correctly. Also, X is being initialized as you have suggested i.e. void inject(X x); I will update in the question as well.
– divyum
Nov 14 '18 at 19:44
Thanks @ConstOrVar, I forgot to mention here that A is a dependency of some other class (let's call X) and A is being initialized correctly. Also, X is being initialized as you have suggested i.e. void inject(X x); I will update in the question as well.
– divyum
Nov 14 '18 at 19:44
Thanks @ConstOrVar, I forgot to mention here that A is a dependency of some other class (let's call X) and A is being initialized correctly. Also, X is being initialized as you have suggested i.e. void inject(X x); I will update in the question as well.
– divyum
Nov 14 '18 at 19:44
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53306403%2fdagger-2-null-pointer-in-field-injection%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown