Странная ошибка инъекции 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 из гуавы тоже был загружен, поэтому я понятия не имею, что вызывает это.


person Andrew Mao    schedule 05.03.2013    source источник


Ответы (1)


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

synchronizedNavigableSet появился только в версии 13.0. Возможно ли, что вы компилируете его, но запускаете более старую версию Guava?

person Jon Skeet    schedule 05.03.2013
comment
Да, это действительно было проблемой. Два противоречивых объявления Guava в разных проектах pom.xml. Eclipse использовал новейшую версию для компиляции, но работа выполнялась в соответствии с фактическими правилами Maven, что вызывало ошибку. - person Andrew Mao; 05.03.2013