2013-03-05 88 views
1

嘗試向Guice注入構造函數時出現一個非常奇怪的錯誤。有一個在構造函數中,如下一個特定的行:奇怪的Guice注入錯誤

@Inject 
public RoundRobinAssigner(
     ... arguments 
     ) { 
      ...stuff 

    assignments = Sets.synchronizedNavigableSet(Sets.<CountingEntry<String>>newTreeSet()); 
} 

這種失敗在注射以下。

1) Error injecting constructor, java.lang.NoSuchMethodError: com.google.common.collect.Sets.synchronizedNavigableSet(Ljava/util/NavigableSet;)Ljava/util/NavigableSet; 
    at edu.harvard.econcs.turkserver.util.RoundRobinAssigner.<init>(RoundRobinAssigner.java:46) 
    at edu.harvard.econcs.turkserver.util.RoundRobinAssigner.class(RoundRobinAssigner.java:40) 
    while locating edu.harvard.econcs.turkserver.util.RoundRobinAssigner 

但是,如果我刪除Sets.synchronizedNavigableSet()包裝,東西注入就好了。

@Inject 
public RoundRobinAssigner(
     ... arguments 
     ) {  
      ...stuff 

    assignments = Sets.<CountingEntry<String>>newTreeSet(); 

} 

顯然,這是次優的,因爲我想使用同步集合。爲什麼Guice所謂的教練會表現出與正常教師不同的行爲?這些代碼都沒有任何編譯問題,並且番石榴的類Sets也被加載了,所以我不知道是什麼導致了這個問題。

回答

8

懷疑你只是看到一個問題,否則你看到的其他地方 - 主要是因爲吉斯參與加載了通過反射類時,的Sets.synchronizedNavigableSet不可用的「鏈接時」誤差範圍內所示Guice的上下文,而不是在「正常的」構造函數調用中。

synchronizedNavigableSet 13.0只推出 - 這可能是你編譯對抗,但運行針對舊版本的番石榴?

+0

是的,這確實是問題所在。兩個相互矛盾的Guava聲明在不同的項目「pom.xml」中。 Eclipse正在使用最新版本進行編譯,但運行遵從實際的Maven規則,導致錯誤。 – 2013-03-05 04:53:53