0

私はguiceの経験があり、guice-persistを試しました。しかし、非常に単純なモジュールで非常に奇妙なエラーが発生しました。これは私のモジュールです:

public class VotingModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(VotingService.class).to(VotingServiceImpl.class);
    }

}

サービスのインスタンスを取得するために、ファクトリを作成しました (これはこの API を使用するためのもので、メインはありません)。

    public static VotingService getService(final String persistenceUnit) {
    // initialization of dependency injection
    Injector i = Guice.createInjector(new JpaPersistModule(persistenceUnit), new VotingModule());
    // Starts persistence stuff (jpa is ready now)
    i.getInstance(PersistService.class).start();
    return i.getInstance(VotingService.class);
}

VotingService とその実装は、単純なデータベースの対話をカプセル化します。この「VotingServiceImpl」では、EntityManager のみを注入し、一部のメソッドで @Transactionl を使用します。だから、なぜ私は得る

    1) Unable to method intercept: com.prodyna.nabucco.groupware.voting.core.service.impl.VotingServiceImpl
  at com.prodyna.nabucco.groupware.voting.core.service.impl.VotingModule.configure(VotingModule.java:10)

? この単純なテストでエラーがスローされます。

   @Test
    public void test(){
        VotingService vs = VotingServiceFactory.getService();
    }

編集 このエラーは、バインドされた実装で @Transactional が使用されている場合にのみ発生します。AOP で問題が発生しましたが、どうすれば修正できますか? 編集

4

3 に答える 3

1

数時間のデバッグの後、問題が見つかりました。問題は、インターフェイスの実装のプライベート コンストラクターでした。バニラのguiceプライベートコンストラクターは問題ありません(私見の良い習慣-「new」は使用できません)。ただし、AOP (インターセプター) はプライベート コンストラクターでは機能しません。

それについてドキュメントにいくつかのヒントがあるはずだと思いますか?!

于 2014-02-11T13:33:57.490 に答える