Внедрение с помощью Guice игнорируется?

Я установил фабрику в Google Guice с помощью AssistedInject, но получаю следующую ошибку (я запускаю модульные тесты с JUnit):

com.google.inject.CreationException: Guice creation errors:

1) No implementation for clusterestimator.OptimalClusterEstimatorFactory was bound.
  while locating clusterestimator.OptimalClusterEstimatorFactory
    for parameter 0 at com.myfeed.algorithm.clusterer.tree.fca.BasicFCATreeFactory.<init>(BasicFCATreeFactory.java:16)
  FCAModule.configure(FCAModule.java:29)

Эта ошибка такая же, даже если я опущу строку install(new Factory...); в своем модуле, что заставляет меня думать, что строка каким-то образом игнорируется.

Вот код модуля:

public class FCAModule extends AbstractModule {

    @Override
    protected void configure() {
        install(new FactoryModuleBuilder() // <-- Factory line that's not working
            .implement(OptimalClusterEstimator.class, FCAOptimalClusterEstimator.class)
            .build(OptimalClusterEstimatorFactory.class));
        bind(ValueWell.class).to(MapBackedValueWell.class).asEagerSingleton();
        bind(FCATreeFactory.class).to(BasicFCATreeFactory.class).asEagerSingleton();
        bind(ItemFactory.class).to(MapBackedItemFactory.class).asEagerSingleton();
        bind(ClustererFactory.class).asEagerSingleton();
        bind(ClusterFactory.class).to(MemoryBackedClusterFactory.class).asEagerSingleton();
    }

}

Вот заводской интерфейс:

public interface OptimalClusterEstimatorFactory {
    public <T> OptimalClusterEstimator createFCA(int kValue, ItemPointReducer<T> pointReducer);
}

Вот конструктор FCAOPtimalClusterEstimator:

@AssistedInject
public FCAOptimalClusterEstimator(@Assisted int kValue, @Assisted ItemPointReducer<T> pointReducer) {
    this.kValue = kValue;
    this.pointReducer = pointReducer;
}

Вот конструктор BasicFCATreeFactory, который в первую очередь вызывается для другой фабрики. Обратите внимание, что эта фабрика не создается с помощью AssistedInject, потому что она использует универсальные шаблоны.

@Inject
public BasicFCATreeFactory(OptimalClusterEstimatorFactory optimalClusterEstimatorFactory, ClustererFactory clustererFactory, ClusterFactory clusterFactory) {
    this.optimalClusterEstimatorFactory = optimalClusterEstimatorFactory;
    this.clustererFactory = clustererFactory;
    this.clusterFactory = clusterFactory;
}

person sinθ    schedule 21.03.2014    source источник
comment
Красиво оформленный вопрос; на первый взгляд вроде все ок. Это был бы странный режим отказа, но пробовали ли вы его с @Inject вместо @AssistedInject? @AssistedInject требуется только при наличии нескольких инъекционных конструкторов; только с одним конструктором @Inject работает.   -  person Jeff Bowman    schedule 22.03.2014


Ответы (2)


По неизвестной причине удаление общей части <T> из заводского интерфейса решило проблему. У меня раньше были проблемы с дженериками и Guice, так что, возможно, это просто еще одна из этих причуд из-за стирания типа.

Итак, теперь заводской интерфейс:

public interface OptimalClusterEstimatorFactory {
    public OptimalClusterEstimator createFCA(int kValue, ItemPointReducer pointReducer);
}
person sinθ    schedule 22.03.2014

Инъекции с помощью Guice не работают с дженериками. Если вы хотите использовать дженерики, вам нужно написать свою собственную фабрику.

person kanbagoly    schedule 29.03.2014