2012-02-03 32 views
0

即時使用檢票口,因爲現在幾個月,我最近開始掃視檢票口。 因此Im相當吉斯noobie :)無限循環當使用檢票口

每個頁面有一個服務類(可以稱之爲DoService),其管理對象的數量(即用戶)... 這些對象也得到了一些原因,該服務類的引用。

public class page ... { 
    @Inject 
    private DoService doService; 
} 

public class DoService ... { 
    private Collection<User> ... 
} 

public class User { 
    @Inject 
    private DoService doService; 
} 

我不是很確定,但我認爲以下異常發生依賴循環引用的原因,雖然我還以爲吉斯所有itsself管理此。

無論.....如果你需要更多的信息來了解我的問題請事先詢問:)

感謝

java.lang.StackOverflowError 
    at java.lang.reflect.InvocationTargetException.<init>(InvocationTargetException.java:54) 
    at WICKET_....DoService$$FastClassByCGLIB$$ce256f9.invoke(<generated>) 
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 
    at org.apache.wicket.proxy.LazyInitProxyFactory$CGLibInterceptor.intercept(LazyInitProxyFactory.java:317) 
    at WICKET_....DoService$$EnhancerByCGLIB$$d1f8934e.rollback(<generated>) 
    at WICKET_c....DoService$$FastClassByCGLIB$$ce256f9.invoke(<generated>) 
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 
...... 

回答

2

我覺得你的設計是不正確的:域對象不應該包含對服務的引用。你確實有一個循環依賴。

+0

嗨,我同意你的看法,雖然這不是關於DO設計,我只是想提供一個簡單的例子。在真實世界的應用中,反向參考很重要:( – 2012-02-03 13:32:06

+1

)如果反向參考很重要,重新考慮設計可能不是一個好主意。很高興看到設計,因爲您看到它,所以其他人也可以查看它。 – 2012-02-03 13:36:28

+0

嗨,再次感謝您的回覆。經過一些進一步的調查發現,錯誤是由一個完全不同的問題造成的。服務的生命週期由不同的對象管理,因爲我需要它的作用範圍爲threadlocal。事實上,wicket-guice正在處理代理對象,這些代理被連接到threadlocal,並且下次這個依賴被注入時,這個代理的代理是由wicket-guice創建的。這導致了infinit循環:( – 2012-02-04 10:19:40

0

Guice在此做的是爲每個用戶實例的每個DoService實例和一個新的DoService實例創建一個新的User實例。我不認爲你想在這裏存檔(除了可疑的設計)。 有解決這個問題的幾種方法:

  1. 使用合適的供應商的模塊中
  2. 使用單在吉斯
  3. 使用吉斯只有這些instanciations的一個範圍。讓一個對象創建另一個對象,並將其自身提供給另一個對象的構造器以進行反向引用。