我想根据一些输入标准设置事务管理器,因此我从声明性转移到程序化事务管理。
就像是
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 尝试过它。在“结果”之前,一切似乎都很好。在此之后,对象丢失。该问题的可能原因和解决方案是什么?