I'm running into a issue with CDI Injection into a Weld container in JBoss 7.1.1
I've got the following object model :
@Stateless
class ServiceEjb {
@Inject
A a;
}
class A {
@Inject
B b;
}
class B {
@Inject
A a;
}
When trying to inject A or B in my stateless class, injection loop and crash with a javax.enterprise.inject.CreationException.
I try many thing (scoping, @Singleton on A or B but without success). I don't want to break the code, and those injections makes senses.
Any clues will be greatly appreciated.
Circular dependency injection is not required by the CDI standard, unless at least one bean in the cycle has a normal scope. The easiest solution to this is to give A or B a normal scope. If you can't give either a normal scope (from the code mock-up, it looks like they all have the default @Dependent
pseudo-scope), you will have to look for other solutions. Posting a real code sample might let us help you with a particular solution, but here is a start:
@Inject
C instead of each other?Here are some SO links with other solutions that you might find helpful:
MVP with CDI; avoiding circular dependency
https://stackoverflow.com/questions/14044538/how-to-avoid-cdi-circular-dependency
I solved the problem by using javax.inject.Provider explicitly. Although I feel like this should be done under the hood by WELD automatically this was not the case for me too. This worked for me and solved my related problem.
class A {
@Inject
Provider<B> b; // access with b.get()
}
class B {
@Inject
Provider<A> a; // access with a.get()
}
I haven't tested it, but it could be enough to use one Provider to break the cycle, i.e. you don't need to use it in both classes.
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