Spring AOP订购 - Advise之前的交易

时间:2011-02-16 21:18:58

标签: spring hibernate aop

我正在写一些建议,我希望在获得建议之前提交事务。它似乎适用于Save和Delete,但是当我更新时,它会通过建议运行,然后抛出异常。

try {
    retVal = pjp.proceed();
} catch (Exception e) {
    PSPSFaultException fault = new PSPSFaultException(e);
    pmLog.error(ERR_MSG, fault);
    throw fault;
}

正如你在这里看到的,我试图在我们自己的运行时异常中包装异常。

我试过订购:

<tx:annotation-driven transaction-manager="txManager" order="1"/>

@Around( "execution(* blah.blah.PersistenceProvider.*(..))")
@Order(value=2)
public Object persistenceWrapper(ProceedingJoinPoint pjp) throws Throwable {

但这似乎没有对堆栈或功能产生任何影响。

@Transactional(propagation = Propagation.REQUIRED)
public class PersistenceProviderImpl extends HibernateDaoSupport implements  PersistenceProvider {

@Override
public void update(Object o) {
    this.getHibernateTemplate().update(o);
}

有没有办法在建议之前获取更新?这些交易都是在dao级别......

2 个答案:

答案 0 :(得分:8)

好的,所以你做错了两件事:

  1. 您的建议附近应该有更高的价值,附近有更大的价值 您的事务管理器(建议的优先级更高,已执行 第一个 - 事务管理器的优先级较低,稍后执行)
  2. Yous应该将@Order(1)注释放在整个@Aspect类前面(很奇怪,但它对我有用)
  3. 这样的事情:

    ...
    <tx:annotation-driven transaction-manager="txManager" order="200"/>  
    ...
    @Order(1)
    @Aspect
    public class MyAspect {
    ...
    

答案 1 :(得分:1)

就我而言,上述建议无效。我正在使用编译时编织Maven,所以这可能是原因。

我的目标是在事务完成后处理数据库异常并将它们包装到另一个异常中。

我必须包含在其中一个Aspect文件中(我想哪一个无关紧要):

@DeclarePrecedence(value = "*..*TransactionException*,     org.springframework.transaction.aspectj.AbstractTransactionAspect, *..*Logging*, *")