春天& dirtiescontext& AnnotationTransactionAspect

时间:2014-12-10 14:45:26

标签: java spring

我使用的是Spring 4.1.2。 Junit 4和带有DirtiesContext的SpringJUnit4ClassRunner。

在Spring破坏旧的上下文并创建新的上下文后,我可以看到所有的bean都是新的。但它们由相同的AnnotationTransactionAspect类代理。有趣的是那些AnnotationTransactionAspect-s(TransactionAspectSupport)有一个新的beanFactory!但同时他们有旧的transactionManagerCache-s来缓存前一次测试中的旧连接(并且在第一次测试结束时关闭弹簧后这些连接已经关闭)。 为什么Spring不会创建新的AnnotationTransactionAspects?

P.S。从Spring 3.X迁移到4.X后,我似乎开始面临这个问题。

2 个答案:

答案 0 :(得分:1)

这是Spring的一个错误。 https://jira.spring.io/browse/SPR-12518已在4.1.4

中修复

答案 1 :(得分:0)

我没有得到如何修复AnnotationTransactionCreation。我做了一个黑客。 为PlatformTransactionManager创建代理

public class TestTransactionManager implements PlatformTransactionManager {
private static List<TestTransactionManager> transactionManagerList = new ArrayList<>();

private PlatformTransactionManager transactionManager;

public void init() {
    transactionManagerList.add(this);
    for (TestTransactionManager m : transactionManagerList) {
        m.setTransactionManager(transactionManager);
    }
}

public void setTransactionManager(PlatformTransactionManager transactionManager) {
    this.transactionManager = transactionManager;
}

@Override
public TransactionStatus getTransaction(TransactionDefinition transactionDefinition) throws TransactionException {
    return transactionManager.getTransaction(transactionDefinition);
}

@Override
public void commit(TransactionStatus transactionStatus) throws TransactionException {
    transactionManager.commit(transactionStatus);
}

@Override
public void rollback(TransactionStatus transactionStatus) throws TransactionException {
    transactionManager.rollback(transactionStatus);
}

}

并将其放入测试应用程序上下文

<bean id="testTransactionManager" class="ru.bpc.core.integration.stub.TestTransactionManager" init-method="init">
    <property name="transactionManager" ref="transactionManager"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="testTransactionManager"/>