я создаю инжектор:Google Guice не может работать с двумя модулями
private static Injector mvpInjector = Guice.createInjector(
HandlingModule.getInstance(),
StorageModule.getInstance()
);
Тогда я пытаюсь получить экземпляр класса:
mvpInjector.getInstance(ImageCreatePresenter.class).showImageCreateWindow();
Это класс конструктор, который нужно впрыскивать:
@Inject
public ImageCreatePresenterImpl(ImageCreateView imageCreateView, StorageHelper storageHelper, ImageCreater imageCreater) {
this.imageCreateView = imageCreateView;
this.storageHelper = storageHelper;
this.imageCreater = imageCreater;
}
Но, во Inject, бросить исключение:
Exception in thread "main" com.google.inject.CreationException: Unable to create injector, see the following errors:
1) No implementation for com.dugin.rostislav.StorageHelper was bound.
while locating com.dugin.rostislav.StorageHelper
for parameter 1 at com.dugin.rostislav.presenter.ImageCreatePresenterImpl.<init>(ImageCreatePresenterImpl.java:26)
at com.dugin.rostislav.modules.HandlingModule.configure(HandlingModule.java:32)
Мои модули:
1.
public class HandlingModule extends AbstractModule {
private static final HandlingModule module = new HandlingModule();
private HandlingModule() {
//Closed constructor
}
public static HandlingModule getInstance() {
return module;
}
@Override
protected void configure() {
bind(MainWindowPresenter.class).to(MainWindowPresenterImpl.class).in(Singleton.class);
bind(ImageCreatePresenter.class).to(ImageCreatePresenterImpl.class).in(Singleton.class);
bind(ImageCreater.class).to(ImageCreaterImpl.class).in(Singleton.class);
bind(ImageCreateView.class).to(ImageCreateViewImpl.class).in(Singleton.class);
bind(MainView.class).to(MainViewImpl.class).in(Singleton.class);
}
}
2.
public final class StorageModule extends AbstractModule {
private final static StorageModule module = new StorageModule();
private TypeListener storageHelperListener = new TypeListener() {
@Override
public <I> void hear(final TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) {
typeEncounter.register(new InjectionListener<I>() {
@Override
public void afterInjection(Object o) {
if (o instanceof StorageHelper) {
try {
((StorageHelper) o).initDB();
} catch (DBInitializationException e) {
throw new RuntimeException(e);
}
}
}
});
}
};
private StorageModule() {
//Closed constructor
}
public static StorageModule getInstance() {
return module;
}
@Override
protected void configure() {
bind(ImageDB.class).to(SQLiteDB.class).in(Singleton.class);
bind(StorageHelper.class).to(StorageHelperImpl.class).in(Singleton.class);
bind(ImagesHelper.class).to(ImagesHelperImpl.class).in(Singleton.class);
bind(String.class)
.annotatedWith(Names.named(StorageModuleConst.DB_FOLDER_PATH))
.toProvider(Providers.of(StorageConst.OSLOADER_DATA_FOLDER));
bind(String.class)
.annotatedWith(Names.named(StorageModuleConst.IMAGES_FOLDER_PATH))
.toProvider(Providers.of(StorageConst.OSLOADER_IMAGES_FOLDER));
bindListener(Matchers.any(), storageHelperListener);
}
}
Не мой класс существует!
Почему я принимаю ошибку и как она исправляется?
StorageHelperImpl конструктор:
@Inject
public StorageHelperImpl(@NonNull ImageDB database, @NonNull ImagesHelper imagesHelper) {
this.database = database;
this.imagesHelper = imagesHelper;
}
Пожалуйста, покажите конструктор (или как вы впрыснуть) 'StorageHelperImpl'. –
Кроме того, возможно ли, что это проблема с пакетом? Например, вы создаете два класса с одинаковым именем в двух разных пакетах? Я думаю здесь о 'StorageModule' и' StorageHelper'. Проверьте весь свой импорт. –
@ OlivierGrégoire, нет ... У меня есть только один класс с каждым именем. Я обновляю вопрос. – bukashka101