用Guice注入EntityManager

时间:2017-11-08 09:39:35

标签: java guice guice-persist

在我的帖子中收到一个关于Guice注射的非常好的答案后,我想知道,如果你也可以帮我注射Guice中的EntityManagers。

我已经阅读了关于Guice JPA的文章https://github.com/google/guice/wiki/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();
    }
}

----------------------------- EDIT ----------------- --------------------

重写了以上部分。

Tl;博士版: ModuleBinder搞砸了EntityManager的注入 - 为什么?

---------------------------发现错误------------------ -------------

我觉得有点愚蠢,我发现了错误。在查看您可以看到的ModuleBinder时,它会将所有内容绑定为EagerSingleton,但很明显,EntityManager尚不存在(PersistService在创建Injector后启动)。我在这里创建了一个新帖子:https://stackoverflow.com/questions/47181835/jpapersistencemodule-guice-injector

可以帮助其他人!

致以最诚挚的问候,

JosefRucksack

1 个答案:

答案 0 :(得分:0)

我觉得有点愚蠢,我发现了错误。在查看您可以看到的ModuleBinder时,它会将所有内容绑定为EagerSingleton,但很明显,EntityManager尚不存在(PersistService在创建Injector后启动)。

调用

final Injector injector = persistenceInjector.createChildInjector(new ModuleBinder());

修复一切。它创建了一个childInjector,它知道父知道的所有内容,因此PersistenceService已经启动,你可以将EntityManager注入到所有内容中。