-1

在我在关于 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);
}

用我的数据库实例化 JAPersistService。

我收到一个错误,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;博士版:ModuleBinder 搞砸了 EntityManager 的注入 - 为什么?

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

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

愿它帮助其他人!

此致,

约瑟夫背包

4

1 回答 1

0

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

打电话

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

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

于 2017-11-08T14:19:07.010 回答