我想根据一些输入标准设置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。在“结果”之前,一切似乎都很好。在此之后,对象丢失。这个问题的可能原因和解决方案可能是什么?
答案 0 :(得分:4)
调用者获取一个null对象,因为你没有从你的方法返回任何东西:
public Object transactionManagerProviderResult(final ProceedingJoinPoint pjp) {
return transactionTemplate.execute(new TransactionCallback() {
// ...
为什么你自己需要这样做而不是让@Transactional
Spring支持为你做这件事并不是很清楚。