2017-11-08 8 views
-1

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

+0

コードにすべての問題が存在するわけではありません。 GuiceはクラスパスにJPAを実装していないと言っています。 JPA自体はAPIだけであり、何もしません。 APIの実際の実装ロジックを提供するには、Hibernate、EclipseLinkまたはOpenJPAが必要です。 – Gimby

+0

私はそれを認識しています。 EntityManagerFactoryを手動で作成したTomEEの外部でコードを実行すると、うまく動作します。この問題は、サーバーを実行してEntityManagerにアクセスしようとしているときに発生します。 また、エンティティマネージャを挿入しようとしていないときには、 'PersistService persistService = persistenceInjector.getInstance(PersistService.class);という最後のパーシスタンスユニットとすべてが見つかります。 pom.xmlにフォルトがあるかどうかを確認しますか? – JosefRucksack

答えて

0

私は、エラーを発見した、一種のダムを感じます。 ModuleBinderを見ると、すべてがEagerSingletonとバインドされていますが、明らかにEntityManagerは存在しません(PersistServiceはインジェクタの作成後に開始されます)。

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

修正のすべてを呼び出す

。これは、親が知っていることをすべて知っているchildInjectorを作成するため、PersistenceServiceはすでに開始されており、EntityManagerをすべてに注入できます。

関連する問題