Spring AOP订购 - Advise之前的交易

mar*_*rea 1 aop spring hibernate

我正在写一些建议,我希望交易在得到建议之前提交.它似乎适用于保存和删除,但是当我更新时,它会通过建议运行,然后抛出异常.

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

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

我试过订购:

<tx:annotation-driven transaction-manager="txManager" order="1"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

@Override
public void update(Object o) {
    this.getHibernateTemplate().update(o);
}
Run Code Online (Sandbox Code Playgroud)

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

Ond*_*zek 8

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

  1. 您的建议附近应该具有更高的价值,并且您的交易管理器附近应该有更大的价值(建议的优先级更高,先执行 - 事务管理器的优先级更低 - 稍后执行)
  2. Yous应该把@Order(1)注释放在@Aspect全班面前(奇怪,但它对我有用)

像这样的东西:

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

  • 只是为了澄清,来自[Spring docs](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-ataspectj-advice-ordering)_Given两个方面,从```Ordered.getValue()```(或注释值)返回较低值的方面具有较高的优先级._ (2认同)