Внедрение EntityManager с Guice
После того, как я получил очень хороший ответ в своем посте о внедрении Guice в целом, я захотел узнать, не могли бы вы также помочь мне с внедрением EntityManagers в Guice.
Я уже прочитал статью https://github.com/google/guice/wiki/JPA о Guice JPA. Мой код выглядит так (мне нужны провайдеры для моей работы):
Поставщик:
public class DatabaseControllerProvider implements Provider<DatabaseControllerInterface> {
private final Provider<EntityManager> entityManagerProvider;
@Inject
public DatabaseControllerProvider(final Provider<EntityManager> manager) {
this.entityManagerProvider = manager;
}
@Override
public DatabaseControllerInterface get() {
return new DatabaseControllerImpl(entityManagerProvider.get());
}
}
Конструктор DatabaseControllerImplementation:
public class DatabaseControllerImpl implements DatabaseControllerInterface {
private final EntityManager em;
@Inject
public DatabaseControllerImpl(final EntityManager manager) {
this.em = manager;
}
}
Верхний уровень я называю это:
public LogInFront() {
final Injector injector = Guice.createInjector(new ModuleBinder(), new JpaPersistModule("ATVPersistence"));
final PersistService persistService = persistenceInjector.getInstance(PersistService.class);
persistService.start();
logInService = injector.getInstance(LogInServiceInterface.class);
}
создать экземпляр JPAPersistService с моей базой данных.
Я получаю ошибку, что no Implementation for EntityManager was bound
, но если я позвоню
...
public LogInFront() {
final Injector injector = Guice.createInjector(new JpaPersistModule("ATVPersistence"));
final PersistService persistService = persistenceInjector.getInstance(PersistService.class);
persistService.start();
logInService = injector.getInstance(LogInServiceInterface.class);
}
Инстанцирование работает правильно, база данных работает нормально, и все хорошо и легко.
Так что я думаю, что с моим GuiceModule что-то не так. Как видно выше, когда я не звоню new ModuleBinder()
, все работает просто отлично.
public class ModuleBinder extends AbstractModule {
@Override
protected void configure() {
bind(DatabaseControllerInterface.class).asEagerSingleton();
bind(AnalyzerInterface.class).asEagerSingleton();
bind(SystemAdministrationInterface.class).asEagerSingleton();
bind(LogInServiceInterface.class).asEagerSingleton();
}
}
-----------------------------РЕДАКТИРОВАТЬ-------------------- -----------------
Переписан выше раздел.
TL; Dr Edition: ModuleBinder облажался Инъекция EntityManager -почему?
--------------------------- Обнаружена ошибка --------------------- ----------
Я чувствую себя немного глупо, я нашел ошибку. При взгляде в ModuleBinder
Вы можете видеть, что он связывает все как EagerSingleton
, но очевидно, что EntityManager
еще не существует (PersistService запускается после создания инжектора). Я создал новый пост по этому вопросу здесь: JPAPersistenceModule Guice Injector
Пусть это поможет другим людям!
С наилучшими пожеланиями,
JosefRucksack
1 ответ
Я чувствую себя немного глупо, я нашел ошибку. При взгляде в ModuleBinder
Вы можете видеть, что он связывает все как EagerSingleton
, но очевидно, что EntityManager
еще не существует (PersistService запускается после создания инжектора).
призвание
final Injector injector = persistenceInjector.createChildInjector(new ModuleBinder());
Исправляет все. Он создает childInjector, который знает все, что знает родитель, поэтому PersistenceService уже запущен, и вы можете внедрить EntityManager
во все.