在我的帖子中收到一个关于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();
}
}
- - - - - - - - - - - - - - -编辑 - - - - - - - - - - -----------------
重写了以上部分。
Tl; dr版:ModuleBinder搞砸了EntityManager的注入 - 为什么?
---------------------------发现错误--------------------- ----------
我觉得有点愚蠢,我发现了错误。在查看ModuleBinder
时,您可以看到,它将所有内容绑定为EagerSingleton
,但显然,EntityManager
尚不存在(PersistService在创建Injector后启动)。我在这里创建了一个新帖子:https://stackoverflow.com/questions/47181835/jpapersistencemodule-guice-injector
愿它帮助其他人!
最好的祝福,
JosefRucksack
我觉得有点愚蠢,我发现了错误。在查看ModuleBinder
时,您可以看到,它将所有内容绑定为EagerSingleton
,但显然,EntityManager
尚不存在(PersistService在创建Injector后启动)。
调用
final Injector injector = persistenceInjector.createChildInjector(new ModuleBinder());
修复一切。它创建了一个childInjector,它知道父知道的所有内容,因此PersistenceService已经启动,你可以将EntityManager
注入到所有内容中。