2013-03-08 88 views
5

我正在與CDI注入一個問題到焊接容器中的JBoss 7.1.1CDI注入循環

我有以下對象模型:

@Stateless 
class ServiceEjb { 
@Inject 
A a; 
} 

class A { 
@Inject 
B b; 
} 

class B { 
@Inject 
A a; 
} 

當試圖注入或B在我的無狀態類,注入循環和崩潰與javax.enterprise.inject.CreationException。

我嘗試了很多事情(範圍,@Singleton在A或B上,但沒有成功)。 我不想破壞代碼,並且這些注入使感官。

任何線索將不勝感激。

回答

10

Circular dependency injection is not required by the CDI standard,除非週期中至少有一個bean有normal scope最簡單的解決方案是給A或B一個正常範圍。如果你不能提供一個正常範圍(從代碼模型,它看起來像他們都有默認的@Dependent僞範圍),你將不得不尋找其他解決方案。發佈一個真實的代碼示例可能會讓我們幫助您使用特定的解決方案,但這裏是一個開始:

  • A和B可以組合成相同的類嗎?
  • 可以從A和B中提取新類C,以便A和B都可以代替對方嗎?

這裏有一些SO與其他解決方案的鏈接,你可能會發現有用:

MVP with CDI; avoiding circular dependency

https://stackoverflow.com/questions/14044538/how-to-avoid-cdi-circular-dependency

+0

感謝對您的快速回復。我不得不承認正常範圍的概念對我來說不是很清楚。你提供的鏈接講述@NormalScope,但這不存在。如何聲明正常範圍? – jmcollin92 2013-03-08 20:18:47

+0

[大多數範圍是正常範圍。](http://docs.jboss.org/cdi/spec/1.0/html/contexts.html#normalscope)會話,應用程序,對話和請求範圍是正常範圍。這與_pseudoscopes_:singleton和dependent(當您不在範圍註釋中寫入時的默認值)相反。 – Nick 2013-03-08 20:58:53

+0

所以,因爲我已經嘗試聲明範圍,如果我理解的很好,這應該起作用。我可以嘗試使用哪種範圍的DAO(由SessionBean訪問)? – jmcollin92 2013-03-08 22:00:38

4

我用javax.inject.Provider明確地解決了這個問題。儘管我覺得這應該由WELD自動完成,但對我而言,情況並非如此。這對我有用,解決了我的相關問題。

class A { 
    @Inject 
    Provider<B> b; // access with b.get() 
} 

class B { 
    @Inject 
    Provider<A> a; // access with a.get() 
} 

我沒有測試它,但它可能是足夠使用一個供應商來打破這個惡性循環,即你不需要在這兩個類中使用它。

1

你應該注入一個實例<乙>而不是B(和/或實例<一個>而不是A)