【问题标题】:Spring AOP ordering - Transactions before AdviseSpring AOP 排序 - 建议前的交易
【发布时间】:2011-02-16 21:18:57
【问题描述】:

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

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 级别...

【问题讨论】:

  • 具体来说,我的测试正在更新数据库中没有的内容。我收到 HibernateOptimisticLockingFailureException 错误...

标签: spring hibernate aop


【解决方案1】:

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

  1. 你应该在你的建议附近有较小的价值,在附近有更大的价值 您的事务经理(建议优先级更高,已执行 first - 事务管理器的较低优先级,稍后执行)
  2. 你应该把 @Order(1) 注释放在整个 @Aspect 类前面(奇怪,但它对我有用)

类似这样的:

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

【讨论】:

  • 只是为了澄清,从Spring docs 给定两个方面,从Ordered.getValue()(或注释值)返回较低值的方面具有较高的优先级。
  • 这在Ordered 界面中也很明显:int HIGHEST_PRECEDENCE = Integer.MIN_VALUE;
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多