0

いくつかの入力基準に基づいて transactionManager を設定したかったため、宣言型からプログラムによるトランザクション管理に移行しました。

何かのようなもの

public User saveUser(NewUser newUser){

     return transactionTemplate.execute(new TransactionCallback() {
              // the code in this method executes in a transactional context
              public Object doInTransaction(TransactionStatus status) {
                  try {
                        User savedObj = someService.saveUser(newUser);
        return savedObj ;
                } catch (DataManagerAPIException e) {
                    throw new RuntimeException(e);
                }
              }
            });
 }

すべて正常に動作しますが、すべてのサービス呼び出し (トランザクション境界は GWT クライアント サービス レベルにあります。UI --> クライアント サービス --> サービス --> Dao のようなもの) をトランザクション コールバックでラップすると、比較するとコードが混乱します。 @Transactional へ。これを行う簡単な方法はありますか? 多分AOPベースのアプローチですか?

私は次のことを試しました

//Wrap every Client service method with a transaction.

@Around("execution(* com.myProject.server.service.*.*(..))")
public void transactionManagerProviderResult(final ProceedingJoinPoint pjp) {

    transactionTemplate.execute(new TransactionCallback() {

        @Override
        public Object doInTransaction(TransactionStatus status) {
            try {
                            Object result = pjp.proceed();
            return result ;
            } catch (Throwable e) {
                e.printStackTrace();
                return null;
            }
        }
    });
}

コードはトランザクション コンテキスト内で正常に実行され、「結果」には正しい値 (新しく保存されたユーザー) が含まれますが、saveUser メソッド (GWT ウィジェット レイヤー) の呼び出し元は常に null オブジェクトを取得します。GWT とは別に試してみたので、これは GWT の問題ではありません。'result' まではすべて問題ないようです。この後、オブジェクトは失われます。問題の考えられる理由と解決策は何ですか?

4

1 に答える 1

4

メソッドから何も返さないため、呼び出し元は null オブジェクトを取得します。

public Object transactionManagerProviderResult(final ProceedingJoinPoint pjp) {
    return transactionTemplate.execute(new TransactionCallback() {
        // ...

@TransactionalSpring サポートに任せるのではなく、自分でこれを行う必要がある理由はあまり明確ではありません。

于 2011-11-30T19:08:59.580 に答える