CDI injection loop

后端 未结 3 685
轻奢々
轻奢々 2021-01-05 23:00

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          


        
相关标签:
3条回答
  • 2021-01-05 23:45

    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

    0 讨论(0)
  • 2021-01-05 23:49

    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.

    0 讨论(0)
  • 2021-01-05 23:50

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

    0 讨论(0)
提交回复
热议问题