在應(yīng)用中,需要熱切換數(shù)據(jù)源。但發(fā)現(xiàn)如下問題:
- 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
- java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
配置如下
- <bean id= "myDataSource1" class = "org.springframework.jndi.JndiObjectFactoryBean" >
- <property name="jndiName" >
- <value>java:/ds1</value>
- </property>
- </bean>
- <bean id="myDataSource2" class = "org.springframework.jndi.JndiObjectFactoryBean" >
- <property name="jndiName" >
- <value>java:/ds2</value>
- </property>
- </bean>
- <bean id="myTransactionManager" class = "org.springframework.transaction.jta.JtaTransactionManager" >
- <property name="userTransactionName" >
- <value>UserTransaction</value>
- </property>
- <property name="transactionManagerName" >
- <value>java:/TransactionManager</value>
- </property>
- </bean>
- <bean id="swappableDataSource"
- class = "org.springframework.aop.target.HotSwappableTargetSource" >
- <constructor-arg>
- <ref local="myDataSource1" />
- </constructor-arg>
- </bean>
- <bean id="swappable"
- class = "org.springframework.aop.framework.ProxyFactoryBean" >
- <property name="targetSource" >
- <ref local="swappableDataSource" />
- </property>
- </bean>
- <bean id="mySessionFactory1" class = "org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
- <property name="mappingResources" >
- <list>
- <value>test/po/impl/Cus.hbm.xml</value>
- </list>
- </property>
- <property name="hibernateProperties" >
- <props>
- <prop key="hibernate.dialect" > ${hibernate.dialect} </prop>
- <prop key="hibernate.show_sql" > true </prop>
- <prop key="hibernate.generate_statistics" > true </prop>
- <prop key="hibernate.cache.provider_class" >
- org.hibernate.cache.EhCacheProvider</prop>
- </props>
- </property>
- <property name="dataSource" >
- <ref local="swappable" />
- </property>
- </bean>
這里的數(shù)據(jù)源是用應(yīng)用服務(wù)器JNDI提供的,如果用自己的就沒有問題。
- <bean id= "dataSource1" class = "org.springframework.jdbc.datasource.DriverManagerDataSource" >
- <property name="driverClassName" value= "${jdbc.driverClassName}" />
- <property name="url" value= "${jdbc.url1}" />
- <property name="username" value= "${jdbc.username}" />
- <property name="password" value= "${jdbc.password}" />
- </bean>
用應(yīng)用服務(wù)器的JNDI就會出現(xiàn)上面的錯誤
解決方法---------代理為javax.jdbc.DataSource接口就可以了。