Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CDI injection loop

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.

like image 267
jmcollin92 Avatar asked Mar 08 '13 17:03

jmcollin92


2 Answers

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:

  • Can A and B be combined into the same class?
  • Can a new class, C, be extracted from A and B, so that both A and B @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

like image 83
Nick Avatar answered Sep 25 '22 15:09

Nick


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.

like image 30
jan Avatar answered Sep 23 '22 15:09

jan