AOP を使用してプログラムによるトランザクション管理を簡素化できますか?
-
26-10-2019 - |
質問
いくつかの入力基準に基づいて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;
}
}
});
}
コードはトランザクション コンテキスト内で正常に実行され、「result」には正しい値 (新しく保存されたユーザー) が含まれていますが、saveUser メソッドの呼び出し元 (GWT ウィジェット レイヤー) は常に null オブジェクトを取得します。私は GWT とは別に試してみたので、これは GWT の問題ではありません。「結果」まではすべて問題ないようです。この後、オブジェクトは失われます。この問題の考えられる理由と解決策は何ですか?
解決
メソッドから何も返さないため、呼び出し元は null オブジェクトを取得します。
public Object transactionManagerProviderResult(final ProceedingJoinPoint pjp) {
return transactionTemplate.execute(new TransactionCallback() {
// ...
なぜこれをユーザーに任せるのではなく自分で行う必要があるのかはあまり明確ではありません。 @Transactional
Spring サポートがあなたのためにそれを行います。
所属していません StackOverflow