Java 使用Guice注入EntityManager
在我的帖子中收到一个关于Guice注入的非常好的答案后,我想知道,您是否也可以帮助我在Guice中注入EntityManager 我已经读过关于Guice JPA的文章了。我的代码如下所示(我的工作需要提供程序): 提供者: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
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());