我有一个使用 Spring 3.1.1 的 Web 应用程序。我们有一个使用 JdbcTemplate 的 genericDao。Datasource 在 GenericDaoImpl 中是这样注入的。
public class GenericDaoImpl<T extends Serializable> implements GenericDao<T> {
protected Class<T> entityClass;
protected JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
....
@Override
public List<T> findAll(String sql, ParameterizedRowMapper<T> mapper, Object... args) {
return jdbcTemplate.query(sql, mapper, args);
}
}
这是一个简单的 DAO。
@Repository
public class ElementDaoImpl extends GenericDaoImpl<Element> implements ElementDao {
private static ParameterizedRowMapper<Element> mapper = new ParameterizedRowMapper<Element>() {...};
public List<Element> findChildren(int id) {
sql = "SELECT....";
return findAll(sql, mapper, new Object[] {id});
}
}
目前,凭借独特的数据源,它运行良好。applicationContext 配置有注解。
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/...."/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>
现在我必须集成一个仍然使用genericDao的新DAO,但在另一个数据库(所以另一个数据源)上工作。
我在服务中使用@Transactionnal。我在 spring 文档上读到,我们可以给事务一个限定符,以便选择好的事务管理器。
所以,我创建了一个新的数据源,一个新的事务管理器......
<bean id="firstDS" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/...."/>
</bean>
<bean id="secondDS" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/...."/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="firstDS"/>
</bean>
<bean id="txManagerSecond" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="secondDS"/>
<qualifier value="txSecond"/>
</bean>
<tx:annotation-driven proxy-target-class="true"/>
在我的新服务上,我已将值添加到 @Transactionnal 注释中:
@Transactionnal("txSecond")
重新开始,我有 4 个类来管理新数据库:服务接口、使用 @Transactionnal("txSecond") 的服务实现、DAO 接口、基于 genericDao 的 DAO 实现,在注入的数据源上创建了一个 JdbcTemplate 对象。
我创建了一个 Junit 测试,但暂时我阻止了一个异常: NoSuchBeanDefinitionException:没有定义 javax.sql.DataSource 类型的唯一 bean。预期单个匹配 bean,但找到 2 个(firstDs,SecondDs)。
我认为 pb 是 genericDao 但不确定。
如何管理?
谢谢你。