2011-02-16 49 views
1

我正在写一些建议,我希望交易在获得建议前进行提交。它似乎适用于保存和删除,但是当我更新时,它会运行彻底的建议,然后抛出异常。春季AOP订购 - 建议之前的交易

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水平...

+0

具体来说,我的测试更新的东西是不是在数据库上。我得到一个HibernateOptimisticLockingFailureException错误... – markthegrea 2011-02-16 21:30:36

回答

7

好了,你做错了两两件事:

  1. 你应该有你附近的意见smaler价值和更大的价值近 您的事务管理器(高优先级建议,执行 第一 - 低优先级的事务管理器,稍后执行)
  2. 你要跟应该把@Order(1)注释全部@Aspect类(怪的面前,但它为我的作品)

类似这样的:

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

只是澄清,从[春季文档](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html# aop-ataspectj-advice-ordering)_给出两个方面,从```Ordered.getValue()```(或注解值)返回较低值的方面具有较高的优先级。' – opyate 2013-02-09 09:53:16

+0

这在“ `有序```接口也是:``int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;``` – opyate 2013-02-09 10:54:39

1

在我的情况下,上述建议是行不通的。我使用编译时与Maven编织,所以这可能是原因。

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

我不得不在上述方面的文件(我猜哪一个无所谓)之一,包括:

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