gen*_*cay 4 java spring web-services jdbc transactionmanager
我尝试在Spring中使用JDBC编写事务管理器.
我的app-servlet.xml
<!-- JDBC Config -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<!-- dataSource TransactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="UserDAOImpl" class="com.project.dao.impl.UserDAOImpl">
<property name="transactionManager" ref="transactionManager"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我的UserDAOImpl.java
public class UserDAOImpl implements UserDAO {
//transaction manager
private DataSourceTransactionManager transactionManager;
private JdbcTemplate jdbcTemplate;
public UserDAOImpl() {
super();
DataSource dataSource = transactionManager.getDataSource();
jdbcTemplate = new JdbcTemplate(dataSource);
}
public void setTransactionManager(DataSourceTransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
....
}
Run Code Online (Sandbox Code Playgroud)
即使我已经transactionManager在我的应用程序,servlet的豆,UserDAOImpl不会因为instatiated transactionManager是null.可能我会错过一些观点,但无法找出问题所在.
您应该为事务管理器使用构造函数注入.Spring将在注入transactionManager属性之前调用构造函数.
public UserDAOImpl()
{
/* Transaction Manager NOT set yet */
DataSource dataSource = transactionManager.getDataSource();
}
Run Code Online (Sandbox Code Playgroud)
将其更改为使用构造函数注入
public UserDAOImpl(TransactionManager transactionManager) ...
Run Code Online (Sandbox Code Playgroud)
然后配置
<bean id="UserDAOImpl" class="com.project.dao.impl.UserDAOImpl">
<constructor-arg ref="transactionManager"/>
</bean>
Run Code Online (Sandbox Code Playgroud)