2013-04-17 8 views
0

Я только начал изучать, как использовать Guice, и у меня возникли проблемы с настройкой вспомогательных инъекций. У меня есть следующий интерфейс:Guice: не может вводить вспомогательный список <Long>

public interface Individual extends Comparable<Individual>, Iterable<Long>{ ... } 

Он будет создан заводом. Конструктор должен получить список длинный:

public interface IndividualFactory { 
    public Individual createIndividual(List<Long> chromossomes); 
} 

Класс реализации имеет @Assisted параметр, чтобы получить список:

public class IndividualImpl implements Individual { 
@Inject 
public IndividualImpl(
    ConfigurationService configurationService, 
    RandomService randomService, 
    FitnessCalculatorService fitnessService, 
    @Assisted List<Long> chromossomes 
    ) { ... } 

Наконец, это мой модуль класса:

public class SimpleModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(Individual.class).to(IndividualImpl.class); 
     install(new FactoryModuleBuilder().implement(Individual.class, 
      IndividualImpl.class).build(IndividualFactory.class)); 
} 

Проблема заключается в том, что эта ошибка отображается при запуске проекта:

1) No implementation for java.util.ArrayList<java.lang.Long> annotated with @com.google.inject.assistedinject.Assisted(value=) was bound. 
    while locating java.util.ArrayList<java.lang.Long> annotated with @com.google.inject.assistedinject.Assisted(value=) 
    for parameter 3 at implementation.entities.IndividualImpl.<init>(IndividualImpl.java:25) 
    at SimpleModule.configure(SimpleModule.java:36) 

Если я просто удаляю вспомогательный параметр (не только аннотацию, но и сам параметр), все работает нормально. Я не могу понять, что я делаю неправильно. Я следил за всеми учебниками Guice, которые я нашел, и не смог найти пример вспомогательного параметра, используя Список <>; однако, даже если я изменяю этот параметр на Integer, например, я получаю ту же ошибку.

ответ

3

Снимите:

bind(Individual.class).to(IndividualImpl.class); 

С связывании вы указали использовать IndividualImpl для @Inject Individual. Это не имеет никакого смысла, так как вы не будете @Inject Individual в любом месте кода. Вместо этого вы будете @Inject IndividualFactory.

Что бы отдаленно возможно это

bind(Individual.class).toProvider(BlowUpWithUseFactoryExceptionProvider.class); 

, но это не имеет никакого смысла делать это, как beahavior по умолчанию аналогично.

Могу ли я предложить:

Iterable<Long> -> DnaContaining 
List<Long> -> DnaMaterial 
+1

это полностью имеет смысл. Я пробовал это раньше, но сделал что-то неправильно и не мог определить, что. Теперь это просто сработало. По вашему предложению мне понравилось. Мне нужно что-то изменить в коде, но я обязательно это сделаю. –

Смежные вопросы