在应用中,需要热切换数据源。但发现如下问题: 

Java代码   收藏代码
  1. org.springframework.beans.factory.BeanCreationException: Error creating bean with name  'swappable'  defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is  null   
  2. java.lang.IllegalArgumentException: Superclass has no null  constructors but no arguments were given  

配置如下 

Java代码   收藏代码
  1. <bean id= "myDataSource1"   class = "org.springframework.jndi.JndiObjectFactoryBean" >  
  2.     <property name="jndiName" >  
  3.         <value>java:/ds1</value>  
  4.     </property>  
  5. </bean>  
  6.   
  7. <bean id="myDataSource2"   class = "org.springframework.jndi.JndiObjectFactoryBean" >  
  8.     <property name="jndiName" >  
  9.         <value>java:/ds2</value>  
  10.     </property>  
  11. </bean>  
  12.   
  13.   
  14. <bean id="myTransactionManager"   class = "org.springframework.transaction.jta.JtaTransactionManager" >  
  15.   
  16.     <property name="userTransactionName" >  
  17.         <value>UserTransaction</value>  
  18.     </property>   
  19.       
  20.     <property name="transactionManagerName" >  
  21.         <value>java:/TransactionManager</value>  
  22.     </property>  
  23.   
  24. </bean>  
  25.   
  26. <bean id="swappableDataSource"   
  27.       class = "org.springframework.aop.target.HotSwappableTargetSource" >  
  28.     <constructor-arg>  
  29.         <ref local="myDataSource1" />  
  30.     </constructor-arg>  
  31. </bean>  
  32.   
  33. <bean id="swappable"   
  34.       class = "org.springframework.aop.framework.ProxyFactoryBean" >  
  35.     <property name="targetSource" >  
  36.         <ref local="swappableDataSource" />  
  37.     </property>  
  38. </bean>  
  39. <bean id="mySessionFactory1"   class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >  
  40.     <property name="mappingResources" >  
  41.         <list>  
  42.             <value>test/po/impl/Cus.hbm.xml</value>        
  43.         </list>  
  44.     </property>  
  45.     <property name="hibernateProperties" >  
  46.         <props>  
  47.             <prop key="hibernate.dialect" > ${hibernate.dialect} </prop>  
  48.             <prop key="hibernate.show_sql" > true </prop>  
  49.             <prop key="hibernate.generate_statistics" > true </prop>  
  50.             <prop key="hibernate.cache.provider_class" >  
  51.             org.hibernate.cache.EhCacheProvider</prop>  
  52.         </props>  
  53.     </property>  
  54.     <property name="dataSource" >  
  55.         <ref local="swappable" />  
  56.     </property>  
  57. </bean>  



这里的数据源是用应用服务器JNDI提供的,如果用自己的就没有问题。  

Java代码   收藏代码
  1. <bean id= "dataSource1"   class = "org.springframework.jdbc.datasource.DriverManagerDataSource" >  
  2.     <property name="driverClassName"  value= "${jdbc.driverClassName}" />  
  3.     <property name="url"  value= "${jdbc.url1}" />  
  4.     <property name="username"  value= "${jdbc.username}" />  
  5.     <property name="password"  value= "${jdbc.password}" />  
  6. </bean>  



用应用服务器的JNDI就会出现上面的错误

 

解决方法---------代理为javax.jdbc.DataSource接口就可以了。