Java Spring@Transactional不工作
我正在尝试使用带注释的TX Spring支持 应用程序上下文XML:Java Spring@Transactional不工作,java,spring,transactions,spring-transactions,Java,Spring,Transactions,Spring Transactions,我正在尝试使用带注释的TX Spring支持 应用程序上下文XML: <?xml ...> <tx:annotation-driven/> <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource"> ... </bean> <bean id="repository" class="Repository">
<?xml ...>
<tx:annotation-driven/>
<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource">
...
</bean>
<bean id="repository" class="Repository">
<constructor-arg ref="dataSource"/>
</bean>
</beans>
public class Repository {
@Transactional
public void save(Op op) {
System.out.println("Transaction active:::: " + TransactionSynchronizationManager.isActualTransactionActive());
...
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/integration-context.xml"})
public class RepositoryTest {
@Autowired
private Repository repository;
@Test
public void testRepositoryPersistence() {
Op op = mock(Op.class);
repository.save(op);
}
}
呼叫代码:
<?xml ...>
<tx:annotation-driven/>
<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource">
...
</bean>
<bean id="repository" class="Repository">
<constructor-arg ref="dataSource"/>
</bean>
</beans>
public class Repository {
@Transactional
public void save(Op op) {
System.out.println("Transaction active:::: " + TransactionSynchronizationManager.isActualTransactionActive());
...
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/integration-context.xml"})
public class RepositoryTest {
@Autowired
private Repository repository;
@Test
public void testRepositoryPersistence() {
Op op = mock(Op.class);
repository.save(op);
}
}
并且它给出了FALSE。
我做错了什么?您应该在配置中添加此选项
<context:annotation-config/>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
这在你的测试课上
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/integration-context.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)
public class RepositoryTest extends AbstractTransactionalJUnit4SpringContextTests{
@Autowired
private IRepository repository;
@Test
public void testRepositoryPersistence() {
Op op = mock(Op.class);
repository.save(op);
}
}
请参阅教程。您能否演示如何调用
save
方法?这里没有足够的信息。您如何解释@Transactional
?使用Spring代理?使用SpringAOP?使用某种形式的编织?这个bean肯定是由Spring创建的吗?也就是说,它在某个地方被自动连接?为什么要使用XML?如何加载XML文件,如何调用save方法。这里的信息太少。扩展了我的问题。您是否尝试过
?+1,因为这可能是正确的。值得注意的是,如果OP使用的是编织(加载或编译时),那么严格来说,接口
不是必需的。当然,这是一个很好的实践!只有当您希望测试成为事务边界时,才真正需要扩展AbstractTransactionalJUnit4SpringContextTests
。事务不一定要工作。此设置基本上使此服务上的@Transactional
无效(除非它需要新的或从不传播级别)。