0

我想根据一些输入标准设置事务管理器,因此我从声明性转移到程序化事务管理。

就像是

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 Widget 层)总是得到一个空对象。这不是 GWT 的问题,因为我也独立于 GWT 尝试过它。在“结果”之前,一切似乎都很好。在此之后,对象丢失。该问题的可能原因和解决方案是什么?

4

1 回答 1

4

调用者得到一个空对象,因为你没有从你的方法返回任何东西:

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

目前还不是很清楚为什么您需要自己做这件事,而不是让@TransactionalSpring 支持为您做这件事。

于 2011-11-30T19:08:59.580 回答