いくつかの入力基準に基づいて 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' まではすべて問題ないようです。この後、オブジェクトは失われます。問題の考えられる理由と解決策は何ですか?