문제

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:

  • 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

다른 팁

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.

You should inject an Instance<B> instead of B (and/or Instance<A> instead of A)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top