Внедрение 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 во все.

Другие вопросы по тегам