2013-03-05 2 views
1

У меня очень странная ошибка при попытке вставить конструктор с помощью Guice. В конструкторе есть определенная линия:Ошибка внедрения в Strange 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 из guava тоже был загружен, поэтому я понятия не имею, что вызывает это.

ответ

8

Я подозреваю вы просто увидеть проблему, которую вы бы иначе увидеть в другом месте - в основном потому, что Guice участвует при загрузке до класса с помощью отражения, ошибка «времени ссылки» из Sets.synchronizedNavigableSet недоступности показана в пределах контекст Guice, а не в «нормальном» вызове конструктора.

synchronizedNavigableSet был введен только в 13,0 - это возможно, что вы компиляцией против этого, но работает против старой версии гуавы?

+0

Да, это действительно проблема. Два противоречивых заявления Гуавы в разных проектах «pom.xml». Eclipse использовал самую новую для компиляции, но запуск подчинялся действительным правилам Maven, вызывая ошибку. –