我们可以通过AOP简化程序化事务管理吗?

时间:2011-11-30 18:26:32

标签: spring spring-transactions

我想根据一些输入标准设置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 Widget图层)的调用者总是获得一个null对象。这不是GWT的问题,因为我也尝试独立于GWT。在“结果”之前,一切似乎都很好。在此之后,对象丢失。这个问题的可能原因和解决方案可能是什么?

1 个答案:

答案 0 :(得分:4)

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

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

为什么你自己需要这样做而不是让@Transactional Spring支持为你做这件事并不是很清楚。