記錄Dao層一個魚唇至極的錯誤 這一天我在使用Spring的進行註解配置項目時, 我的Idea給我拋了一個如下的錯誤: 一開始看到這個錯誤,我趕緊又看了一下我的配置文件: 感覺沒啥毛病啊,難道是spring提供的內置數據源有問題? 於是我就把上邊的數據源替換成c3p0的…... 一運行–– — 'd ...
記錄Dao層一個魚唇至極的錯誤
這一天我在使用Spring的進行註解配置項目時,
我的Idea給我拋了一個如下的錯誤:
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'accountDaoImpl' defined in file [D:\ideaworks\day53_spring4\demo03\target\classes\com\jxk\dao\impl\AccountDaoImpl.class]: Invocation of init method failed;
nested exception is java.lang.IllegalArgumentException:
'dataSource' or 'jdbcTemplate' is required
一開始看到這個錯誤,我趕緊又看了一下我的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 開啟spring對註解事務的支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 註入DataSource -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置spring創建容器時要掃描的包 -->
<context:component-scan base-package="com.jxk"></context:component-scan>
<!-- 配置JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置spring提供的內置數據源 -->
<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/springdb1"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>-->
<!--C3p0數據源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/springdb1"></property>
<property name="user" value="root"></property>
<property name="password" value="root"></property>
</bean>
</beans>
感覺沒啥毛病啊,難道是spring提供的內置數據源有問題?
於是我就把上邊的數據源替換成c3p0的…...
一運行––-—--
'dataSource' or 'jdbcTemplate' is required
難道是註解有干擾?於是在@Autowired下邊添加了一個@Qualifier
@Repository
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
@Autowired
@Qualifier(value = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;
但還是沒有效果..….
但其實,bug就在上邊的幾行代碼里…....
因為copy-paste的原因...我的Dao層實例竟然繼承了一個JdbcDaoSupport
類!!!
繼承這個類的話就可以使用它內置的一個getJdbcTemplate
方法,而不用再自己創建一個jdbcTemplate屬性.….但是這個繼承這個類以後,再去創建自己的jdbcTemplate
會怎麼樣呢?恭喜我,成功為自己製造了一個bug..….
如果要使用註釋註入,就不要在繼承這個類了呀!!!,
報錯的原因正是
我給AccountDaoImpl
註入了jdbcTemplate
,但它繼承的父類JdbcDaoSupport
裡邊的jdbcTemplate
卻還是空的!!!!
如果非要作,還是要繼承這個類的話,可以這樣!!!:
@Repository
public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
//在這裡,給dao層實例的父類的jdbcTemplate也賦值!!!
@Autowired
private void setSuperDataSources(ComboPooledDataSource dataSources){
super.setDataSource(dataSources);
}
copy一時爽!!!!!一直copy一直爽!!!
啊!我的時間!我的頭髮!