Guiceの一般的な注入に関する私の記事で非常に良い回答を得た後、GuiceにEntityManagersを注入する手助けができるかどうかを知りたかったのです。GuiceでEntityManagerを注入
すでにGuice JPAに関する記事https://github.com/google/guice/wiki/JPAを読んでいます。私のコードは、(私は私の仕事のためのプロバイダを必要とする)次のようになります。
プロバイダ:DatabaseControllerImplementationの
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);
}
:私はこれを呼び出す
public class DatabaseControllerImpl implements DatabaseControllerInterface {
private final EntityManager em;
@Inject
public DatabaseControllerImpl(final EntityManager manager) {
this.em = manager;
}
}
トップレベル
JPAPersistServiceをデータベースでインスタンス化する。
私は
...
public LogInFront() {
final Injector injector = Guice.createInjector(new JpaPersistModule("ATVPersistence"));
final PersistService persistService = persistenceInjector.getInstance(PersistService.class);
persistService.start();
logInService = injector.getInstance(LogInServiceInterface.class);
}
を呼び出す場合no Implementation for EntityManager was bound
が、インスタンス化が正常に動作し、データベースが正常に動作し、すべてが素晴らしく、容易であること、エラーが発生します。
私の推測では、私の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はインジェクタの作成後に開始されます)。私はここに新しい投稿を作成しました:JPAPersistenceModule Guice Injector
他の人を助けることができます!
敬具、
JosefRucksack
コードにすべての問題が存在するわけではありません。 GuiceはクラスパスにJPAを実装していないと言っています。 JPA自体はAPIだけであり、何もしません。 APIの実際の実装ロジックを提供するには、Hibernate、EclipseLinkまたはOpenJPAが必要です。 – Gimby
私はそれを認識しています。 EntityManagerFactoryを手動で作成したTomEEの外部でコードを実行すると、うまく動作します。この問題は、サーバーを実行してEntityManagerにアクセスしようとしているときに発生します。 また、エンティティマネージャを挿入しようとしていないときには、 'PersistService persistService = persistenceInjector.getInstance(PersistService.class);という最後のパーシスタンスユニットとすべてが見つかります。 pom.xmlにフォルトがあるかどうかを確認しますか? – JosefRucksack