9

ここで説明するようなGuiceメソッドレベルのトランザクションを使い始めました。次のようなメッセージがあります

@Inject
private EntityManager entityManager;

@Transactional
public UserSession createSession(User user, String browser) {
    UserSession session = new UserSession(user, browser);
    entityManager.persist(session);
}

簡単な説明から、wisで十分だと思いました。しかし、トランザクションが開始されないためにエラーが発生します。自分で起動してコミットした場合にのみ機能します。

オブジェクトは、初期化子のアプリケーションの開始時にGuiceによって作成されます。各リクエストに同じインスタンスが使用されます。

なぜ機能しないのですか?

4

5 に答える 5

7

@Transactionalメソッド アノテーションは を通じて機能しAOP、Guice はFooこれらのアノテーション付きメソッド呼び出しをインターセプトし、(オプションで) それらを実際のオブジェクトに転送するプロキシ オブジェクトを作成することによって の要求を満たします。以下が正しいことを確認してください。

  1. Guice を介してメソッドを使用してオブジェクトを作成しました@Transactional。それ以外の場合、Guice は代わりにプロキシを提供する機会がないためです。

  2. finalAOP はこれらを簡単にオーバーライドできないため、クラスもメソッドもマークされていません。

  3. JpaPersistModuleまたはその他の形式のPersistModuleをインストールしました。そのソース コードから、このモジュールが実際にMethodInterceptor@Transactionalアノテーションにバインドするものであることに注意してください。

これがニーズに正確に合わない場合は、いつでもAOP ドキュメントを参照して、独自のメソッド インターセプターを作成できることを覚えておいてください。幸運を!

于 2013-01-01T07:20:10.983 に答える
2

すべてをもう一度確認したところ、機能しませんでした。おもしろいのは、それがその間に機能したことですが、100回ごとにしか機能しませんでした.

いくつかの追加テストの後、各リクエストでクラスを再作成する必要があることがわかりました。アプリケーションの開始時にそれらを作成する前に。今では完璧に機能しているようです。

ヒントをありがとう、さらに調査するのに役立ちました。

于 2013-01-01T14:15:41.940 に答える
2

あなたと同様の問題があり、@javax.transaction.Transactional から @com.google.inject.persist.Transactional に切り替えることで解決しました。どうやら Guice-Persist は Java Transaction API の @Transactional アノテーションをサポートしていないようです。

于 2014-03-04T13:28:42.887 に答える
0

次の状況でこの問題が発生したため、ここにも解決策を投稿すると思いました。

BusinessLogicには、2 つのコンストラクター引数が必要です。理論的には guice から取得できる と、guice から取得できなかっMyDaoたその他のオブジェクトです。 だから私は()を作成しましたが、)では使用されません。ここで、guice が提供する型と同じようにバインドします。
BusinessLogicProviderextends AbstactProviderbind(BusinessLogic.class).toProvider(BusinessLogicProvider)BusinessLogicProviderbind(BusinessLogicProvider.class);

BusinessLogicProviderクラス内で使用できるようになり@Injectましたprivate Provider<MyDao> daoProvider;

その後、BusinessLogicProviderpublic BusinessLogic get()メソッドで、BusinessLogic必要な 2 つの引数を指定して のコンストラクターを呼び出すdaoProvider.get()ことができます。

落とし穴: myの@Injectedが type でない(しかし simpy の type ) 場合、機能しません。edguice から来たとして も、guice はインスタンス化するたびに新しいものを作成する必要があります。private Provider<MyDao> daoProvider;BusinessLogicProviderProvider<MyDao>MyDao
@InjectMyDao BusinessLogic

于 2013-11-29T09:05:07.067 に答える