Guice Assisted Inject игнорируется?
Я установил фабрику в 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;
}
2 ответа:
По какой-то неизвестной причине удаление универсальной части
<T>
из Заводского интерфейса решило проблему. У меня были предыдущие проблемы с дженериками и Guice, так что, возможно, это просто еще одна из тех причуд из-за стирания типов.Итак, заводской интерфейс теперь:
public interface OptimalClusterEstimatorFactory { public OptimalClusterEstimator createFCA(int kValue, ItemPointReducer pointReducer); }