Spring aop @AfterThrowing在方法注释@Transaction时失败

时间:2015-01-15 10:13:42

标签: spring aop spring-transactions

我想通过Spring aop获取方法的异常,并且该方法注释@Transactional注释。 当我插入DB中的记录时,它将抛出异常,但是aop无法捕获 例外。双重代理问题?外部代理是Transaction,内部代理是aop? 任何想法?

@Override
@Transactional
public boolean doInsert(Object domainObject) throws Exception {
    boolean success = false;

    if (beforeInsert(domainObject)) {
        if (insert(domainObject)) {
            success = afterInsert(domainObject);

        }
    }

    return success;
}

@AfterThrowing(value = "execution(* com.digiwin.newb2.patterns.Nb2ProgramService.doInsert(..))", argNames="retVal", throwing="retVal")
public void doInsertThrowException(Exception ex) {

    int index = 0;

}

插入记录抛出异常但不触发aop ...

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.DataException: could not execute statement
at        org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:143)
at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:680)
at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:562)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)
at com.digiwin.newb2.test.ProgramSingle02TestService$$EnhancerByCGLIB$$8eea6179.doInsert(<generated>)
at com.digiwin.newb2.patterns.SysSingle01Controller.saveActionCore(SysSingle01Controller.java:486)
at com.digiwin.newb2.patterns.SysSingle02Controller.saveActionCore(SysSingle02Controller.java:870)
at com.digiwin.newb2.patterns.SysSingle01Controller.saveAction(SysSingle01Controller.java:410)

0 个答案:

没有答案