我有一个使用Spring 3.1.1的web应用程序。我们有一个使用JdbcTemplate的genericDao。数据源在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"/>现在我必须集成一个新的DAO,仍然使用genericDao,但是在另一个数据库上工作(所以是另一个数据源)。
我在服务中使用@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,但不确定。
该如何管理呢?
谢谢。
发布于 2012-11-12 22:32:34
在配置文件中的每个bean上手动设置dataSource
<bean id="elementDao" class="ElementDaoImpl" autowire="byName">
<property name="datasource" ref="datasource2">
</bean>另一种解决方案:使用“别名”http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#beans-java-bean-aliasing
发布于 2012-11-13 23:38:56
问题是,在自动装配数据源时,您没有指定任何限定符。
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);}
因此,如果您需要同一个类中的两个数据源,请使用两个不同的setter注入来配置它们,并在每种情况下提供适当的限定符。
发布于 2013-10-01 04:12:58
默认情况下,自动连接的注解映射到bean的类型,因此必须使用限定符(“bean id"),以便让spring容器知道在config xml中存在相同类型的多个bean时连接哪个bean。
https://stackoverflow.com/questions/13345206
复制相似问题