spring集成struts事务处理

要在项目中添加声明式事务处理,但是由于开发前期没有很好的规划。很多业务都已经直接写在了action这一层了。service层几乎没写。所以就只有在action层添加事务了。但是添加的事务对于dispatchAction无效。查看代码发现,dispatchAction的所以方法都是通过execute()调用。而spring的声明式事务处理,是通过TransactionInterceptor类来进行拦截调用的。

java 代码
  1. public Object invoke(final MethodInvocation invocation) throws Throwable {   
  2.         // Work out the target class: may be <code>null</code>.   
  3.         // The TransactionAttributeSource should be passed the target class   
  4.         // as well as the method, which may be from an interface.   
  5.         Class targetClass = (invocation.getThis() != null ? invocation.getThis().getClass() : null);   
  6.   
  7.         // If the transaction attribute is null, the method is non-transactional.   
  8.         final TransactionAttribute txAttr =   
  9.                 getTransactionAttributeSource().getTransactionAttribute(invocation.getMethod(), targetClass);   
  10.         final String joinpointIdentification = methodIdentification(invocation.getMethod());   
  11.   
  12.         if (txAttr == null || !(getTransactionManager() instanceof CallbackPreferringPlatformTransactionManager)) {   
  13.             // Standard transaction demarcation with getTransaction and commit/rollback calls.   
  14.             TransactionInfo txInfo = createTransactionIfNecessary(txAttr, joinpointIdentification);   
  15.             Object retVal = null;   
  16.             try {   
  17.                 // This is an around advice: Invoke the next interceptor in the chain.   
  18.                 // This will normally result in a target object being invoked.   
  19.                 retVal = invocation.proceed();   
  20.             }   
  21.             catch (Throwable ex) {   
  22.                 // target invocation exception   
  23.                 completeTransactionAfterThrowing(txInfo, ex);   
  24.                 throw ex;   
  25.             }   
  26.             finally {   
  27.                 cleanupTransactionInfo(txInfo);   
  28.             }   
  29.             commitTransactionAfterReturning(txInfo);   
  30.             return retVal;   
  31.         }  
上面贴出的是主要的代码。可见它是通过对代理类的制定调用方法来进行事务管理。而dispatchAction的所以方法都是通过execute()调用。所以只有拦截其execute方法事务处理才有效。

你可能感兴趣的:(spring,struts,项目管理)