在我的帖子中收到一个关于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
答案 0 :(得分:0)
我觉得有点愚蠢,我发现了错误。在查看您可以看到的ModuleBinder
时,它会将所有内容绑定为EagerSingleton
,但很明显,EntityManager
尚不存在(PersistService在创建Injector后启动)。
调用
final Injector injector = persistenceInjector.createChildInjector(new ModuleBinder());
修复一切。它创建了一个childInjector,它知道父知道的所有内容,因此PersistenceService已经启动,你可以将EntityManager
注入到所有内容中。