`
hehaibo
  • 浏览: 416700 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

No bean named transactionManager is defined 多数据源的单元测试

 
阅读更多

spring 相关的配置

<!--  -->
	<bean id="car_dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		lazy-init="default" dependency-check="default">
		<property name="driverClass">
			<value>${jdbc.driverClassName}</value>
		</property>
		<property name="jdbcUrl">
			<value>${jdbc.url}</value>
		</property>
		<property name="user">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
		<property name="minPoolSize" value="2" />
		<property name="maxPoolSize" value="5" />
		<property name="initialPoolSize" value="2" />
		<property name="maxIdleTime" value="30000" />
		<property name="acquireIncrement" value="1" />
		<property name="idleConnectionTestPeriod" value="1800" />
		<property name="acquireRetryAttempts" value="30" />
		<property name="breakAfterAcquireFailure" value="true" />
		<property name="testConnectionOnCheckout" value="false" />
		<property name="properties">
			<props>
				<prop key="bigStringTryClob">true</prop>
				<prop key="clientEncoding">GBK</prop>
				<prop key="serverEncoding">GBK</prop>
			</props>
		</property>
	</bean>
	<bean id="biap_dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		lazy-init="default" dependency-check="default">
		<property name="driverClass">
			<value>${jdbc.driverClassName}</value>
		</property>
		<property name="jdbcUrl">
			<value>${jdbc.url}</value>
		</property>
		<property name="user">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
		<property name="minPoolSize" value="2" />
		<property name="maxPoolSize" value="5" />
		<property name="initialPoolSize" value="2" />
		<property name="maxIdleTime" value="30000" />
		<property name="acquireIncrement" value="1" />
		<property name="idleConnectionTestPeriod" value="1800" />
		<property name="acquireRetryAttempts" value="30" />
		<property name="breakAfterAcquireFailure" value="true" />
		<property name="testConnectionOnCheckout" value="false" />
		<property name="properties">
			<props>
				<prop key="bigStringTryClob">true</prop>
				<prop key="clientEncoding">GBK</prop>
				<prop key="serverEncoding">GBK</prop>
			</props>
		</property>
	</bean>

	<aop:config>
			<aop:advisor pointcut="execution(* com.hhb.biap.*.service..*.*(..))"
				advice-ref="biap_txAdvice" />
		</aop:config>

		<tx:advice id="biap_txAdvice" transaction-manager="biap_transactionManager" >
			<tx:attributes>
				<tx:method name="create*" />
				<tx:method name="modify*" />
				<tx:method name="insert*" />
				<tx:method name="update*" />
				<tx:method name="delete*" />
				<tx:method name="*" read-only="true" />
			</tx:attributes>
		</tx:advice>
		
		<aop:config>
			<aop:advisor pointcut="execution(* com.hhb.car.*.service..*.*(..))"
				advice-ref="car_txAdvice" />
		</aop:config>

		<tx:advice id="car_txAdvice" transaction-manager="car_transactionManager" >
			<tx:attributes>
				<tx:method name="create*" />
				<tx:method name="modify*" />
				<tx:method name="insert*" />
				<tx:method name="update*" />
				<tx:method name="delete*" />
				<tx:method name="*" read-only="true" />
			</tx:attributes>
		</tx:advice>

 单元测试类:

@ContextConfiguration(locations = {"classpath:spring/common/dataSource.xml","classpath:spring/common/applicationContext.xml",
		"classpath:spring/car/car.xml","classpath:spring/car/car-dao.xml",
		"classpath:spring/biap/biap.xml","classpath:spring/biap/biap-dao.xml"})
public abstract class BaseTest extends AbstractTransactionalJUnit4SpringContextTests {
       //自动装配默认是根据类型类匹配的,用@Qualifier 可以指定具体的数据源
       @Autowired
	public void setDataSource(@Qualifier("car_dataSource") DataSource dataSource) {
		this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}

}
public class BasedaoTest extends BaseTest{
	@Resource(name="carBaseDAO")
	BaseDAO carBaseDAO;
	private String namespace="car_type.";
	@Test
	public void batchDelete() {
		List<Integer> list=new ArrayList<Integer>();
		for (int i=2;i<10;i++) {
			list.add(i);
		}
		this.carBaseDAO.batchDelete(namespace, "deleteCarType", list);
	}
} 

 运行之后报错

[WARN ] 2012-07-06 10:58:20 :Caught exception while retrieving transaction manager with bean name [transactionManager] for test context [[TestContext@d12eea testClass = BasedaoTest, locations = array<String>['classpath:spring/common/dataSource.xml', 'classpath:spring/common/applicationContext.xml', 'classpath:spring/car/car.xml', 'classpath:spring/car/car-dao.xml', 'classpath:spring/biap/biap.xml', 'classpath:spring/biap/biap-dao.xml'], testInstance = com.hhb.car.dao.test.BasedaoTest@15f157b, testMethod = batchDelete@BasedaoTest, testException = [null]]]
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:971)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:246)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:884)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:298)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:146)
	at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:292)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:270)
	at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:332)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
	at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
	at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
	at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
	at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
[WARN ] 2012-07-06 10:58:20 :Caught exception while allowing TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener@b6ef8] to process 'before' execution of test method [public void com.hhb.car.dao.test.BasedaoTest.batchDelete()] for test instance [com.hhb.car.dao.test.BasedaoTest@15f157b]
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:971)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:246)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:884)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:298)
	at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:146)
	at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:292)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runBefores(SpringMethodRoadie.java:270)
	at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:332)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
	at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
	at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
	at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
	at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
	at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
	at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
	at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

 经过断点跟踪调试:

 

org.springframework.test.context.transaction.TransactionalTestExecutionListener
private TransactionConfigurationAttributes retrieveTransactionConfigurationAttributes(Class<?> clazz) {
		Class<TransactionConfiguration> annotationType = TransactionConfiguration.class;
		TransactionConfiguration config = clazz.getAnnotation(annotationType);
		if (logger.isDebugEnabled()) {
			logger.debug("Retrieved @TransactionConfiguration [" + config + "] for test class [" + clazz + "]");
		}

		String transactionManagerName;
		boolean defaultRollback;
		if (config != null) {
			transactionManagerName = config.transactionManager();
			defaultRollback = config.defaultRollback();
		}
		else {
			transactionManagerName = (String) AnnotationUtils.getDefaultValue(annotationType, "transactionManager");
			defaultRollback = (Boolean) AnnotationUtils.getDefaultValue(annotationType, "defaultRollback");
		}

		TransactionConfigurationAttributes configAttributes =
				new TransactionConfigurationAttributes(transactionManagerName, defaultRollback);
		if (logger.isDebugEnabled()) {
			logger.debug("Retrieved TransactionConfigurationAttributes [" + configAttributes + "] for class [" + clazz + "]");
		}
		return configAttributes;
	}
 
 

 默认它会加上事务,事务管理默认的bean名称是transactionManager,因为配置中没有这个bean 的配置,所以抛出异常,这个        TransactionConfiguration config = clazz.getAnnotation(annotationType);
我们没有在测试类上注释,所以为null,去取默认的transactionManager。

我们可以这样做

@TransactionConfiguration(transactionManager="car_transactionManager")
public class BasedaoTest extends BaseTest{

}

 

 

分享到:
评论
3 楼 xintangchao 2015-03-03  
谢谢,但我加个注解后为什么测试类运行正常,但数据却没有插入到数据库呢。
2 楼 hehaibo 2013-09-22  
goahead2010 写道
大谢,测试事务时出现了。

不客气
1 楼 goahead2010 2013-08-23  
大谢,测试事务时出现了。

相关推荐

    SpringMVC配置多数据源实战

    在SpringMVC框架中配置多数据源是一项常见的需求,尤其在大型企业级应用中,由于业务的复杂性,往往需要连接不同的数据库以满足不同模块的需求。以下将详细讲解如何实现这一功能。 首先,理解数据源(DataSource)...

    mybatis-plus多数据源/动态数据源配置示例代码

    Spring的`@Transactional`注解默认不支持多数据源,可能需要自定义TransactionManager和PlatformTransactionManager来处理跨数据源的事务。 6. **测试和调试**: - 测试多数据源配置时,确保每个数据源都能正常...

    ssm实现多数据源配置

    7. **测试和优化**:完成配置后,通过单元测试或集成测试确保多数据源功能正常工作。同时,为了提高性能和减少资源消耗,可以考虑使用连接池,如Druid或HikariCP。 8. **安全性考虑**:处理多数据源时,要注意权限...

    spring boot 多数据源测试源码demo

    本项目是一个基于Spring Boot的多数据源测试源码示例,已经经过测试验证,可以顺利运行。 首先,我们要理解Spring Boot如何集成JPA(Java Persistence API),这是Spring提供的一个ORM(对象关系映射)框架,支持...

    springmvc_mybatis_多数据源

    "springmvc_mybatis_多数据源"这个项目就是针对这种情况提供的一种解决方案。 首先,我们来看SpringMVC如何处理多数据源。在SpringMVC中,我们可以利用Spring的DataSourceTransactionManager和...

    springmvc +shiro+querydsl+jpa框架多数据源配置详细说明

    Spring MVC + Shiro + QueryDSL + JPA 框架多数据源配置详细说明 Spring MVC + Shiro + QueryDSL + JPA 框架多数据源配置是当前 Web 应用程序中常见的技术栈组合。该技术栈组合可以提供强大的安全认证、数据查询和...

    多数据源配置demo

    9. **测试**:编写单元测试或集成测试,验证多数据源配置是否正确工作。 在"Spring+Hibernate+DEMO"这个项目中,你可以找到具体的配置文件(如`applicationContext.xml`或`application.properties`)、Java配置类...

    2771885 - TransactionManager is not ready

    标题:"2771885 - TransactionManager is not ready" 指的可能是SAP系统中的一则官方技术支持文档编号(SAP Note),它描述了与SAP系统中 TransactionManager 服务有关的技术问题。在SAP系统中,TransactionManager...

    cxf多数据源配置

    6. **测试与监控**:最后,别忘了编写测试用例来验证多数据源配置的正确性,并使用监控工具(如Spring Actuator)监控数据源的使用情况,确保系统的稳定运行。 综上所述,"cxf多数据源配置"是一个涉及CXF、Spring和...

    Spring+SpringMVC+Mybatis动态链接多数据源

    这通常需要自定义TransactionManager,或者利用AbstractRoutingDataSource的特性,使其能够处理多数据源的事务。 4. **Mybatis集成**:为每个数据源创建一个SqlSessionFactory,并在Mybatis的配置中指定对应的...

    springboot多数据源即分布式事务解决方案,添加对多线程的支持

    4. 测试用例:包含了对多数据源和分布式事务功能的测试,验证事务的一致性和隔离性。 综上所述,Spring Boot通过其强大的框架能力,为开发者提供了实现多数据源操作、分布式事务管理和多线程支持的解决方案。开发者...

    jeecms 多数据源处理例子

    2. **配置事务管理器**:由于多数据源环境下事务管理较为复杂,需要配置一个支持多数据源的事务管理器,例如`DataSourceTransactionManager`。你需要为每个数据源创建一个事务管理器,并指定对应的数据源bean。 ``...

    SpringBoot多数据源以及多数据源事物

    在Spring Boot应用中,多数据源的配置与事务管理是一项重要的功能,特别是在大型分布式系统中,可能需要连接多个数据库以实现数据隔离或者扩展性。本文将深入探讨Spring Boot如何实现多数据源配置以及多数据源事务...

    Spring MySQL多数据源

    4. 测试策略:如何在测试环境中模拟多数据源,并确保测试的隔离性。 通过理解和掌握这些知识点,你可以有效地在Spring应用中实现和管理MySQL的多数据源架构,从而提高系统的可扩展性和灵活性。

    spring多数据源动态切换方案

    "Spring多数据源动态切换方案"是解决这一问题的关键技术,它允许应用程序根据业务需求动态选择数据源,提高了系统的灵活性和可扩展性。下面我们将详细探讨如何在Spring中实现多数据源的配置及动态切换。 首先,我们...

    mysql多数据源连接代码

    在某些复杂的应用场景中,一个项目可能需要连接并操作多个不同的数据库,这就是所谓的“多数据源”架构。MySQL作为广泛使用的开源关系型数据库,其多数据源连接是实现这种架构的关键技术。下面我们将详细探讨如何在...

    Java多数据源源码

    对于多数据源,Spring的PlatformTransactionManager需要适配,可能需要自定义TransactionManager实现,或者使用Spring的AbstractRoutingDataSource来处理事务的边界。 总的来说,Java Spring Boot结合Druid实现多...

    springboot整合mybatis配置多数据源

    在Spring Boot应用中整合MyBatis并配置多数据源是一项常见的任务,这使得应用程序能够根据需求切换或同时处理多个数据库。下面将详细讲解这个过程的关键步骤、涉及的技术点以及注意事项。 1. **Spring Boot与...

    springboot2.0多数据源集成hibernate配置hibernateDaoSupport示例

    本示例主要介绍如何实现Spring Boot 2.0多数据源的集成,并结合Hibernate进行配置,特别是在DAO层使用`HibernateDaoSupport`进行操作,而非使用JPA(Java Persistence API)。 首先,让我们了解Spring Boot 2.0的...

    spring多数据源

    3. **配置多数据源**:在Spring的XML配置文件中,我们需要定义多个DataSource bean,分别代表不同的数据库连接。这些数据源可以是Apache Commons DBCP、HikariCP、Druid等连接池的实现。例如: ```xml &lt;bean id=...

Global site tag (gtag.js) - Google Analytics