Java 使用Guice注入EntityManager

Java 使用Guice注入EntityManager,java,guice,guice-persist,Java,Guice,Guice Persist,在我的帖子中收到一个关于Guice注入的非常好的答案后,我想知道,您是否也可以帮助我在Guice中注入EntityManager 我已经读过关于Guice JPA的文章了。我的代码如下所示(我的工作需要提供程序): 提供者: public class DatabaseControllerProvider implements Provider<DatabaseControllerInterface> { private final Provider<EntityMa

在我的帖子中收到一个关于Guice注入的非常好的答案后,我想知道,您是否也可以帮助我在Guice中注入EntityManager

我已经读过关于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());
    }
}
顶层我称之为:

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);
}
用我的数据库实例化JPA服务

我收到一个错误,
没有绑定EntityManager的实现
,但是如果我调用

...
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有问题。如上所述,当我不调用
新模块binder()
时,一切正常

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版本: ModuleBinder打乱了EntityManager的注入-为什么

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


我觉得有点傻,我发现了错误。当查看
模块binder
时,您可以看到,它将所有内容绑定为
单例
,但显然,
EntityManager
还不存在(PersistService在创建注入器后启动)。我在这里创建了一个新帖子:

愿它能帮助别人

致以最良好的祝愿


JosefRucksack

我觉得有点傻,我发现了错误。当查看
模块binder
时,您可以看到,它将所有内容绑定为
单例
,但显然,
EntityManager
还不存在(PersistService在创建注入器后启动)

召唤

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

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

并非所有问题都存在于代码中。Guice似乎在告诉您,您的类路径上没有JPA的实现。JPA本身只是一个API,它什么都不做。您需要Hibernate、EclipseLink或OpenJPA来提供API的实际实现逻辑。我知道这一点。在TomEE之外运行代码时,通过手动创建EntityManagerFactory,它可以正常工作。在运行服务器并尝试访问EntityManager时会出现问题。另外,当我不尝试注入实体管理器时,
final PersistService PersistService=persistenceInjector.getInstance(PersistService.class)查找持久性单元和所有内容。是否要查看my pom.xml以检查是否存在任何故障?
final Injector injector = persistenceInjector.createChildInjector(new ModuleBinder());