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 を使用します。そして、良いトランザクションマネージャーを選択するために、トランザクションに修飾子を与えることができる春のドキュメントを読みました。
そこで、新しいデータソース、新しいトランザクション マネージャーを作成します...
<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 のインターフェイス、注入されたデータソースで作成された JdbcTemplate オブジェクトを持つ genericDao に基づく DAO の実装。
Junit テストを作成しましたが、しばらくの間、例外でブロックします : NoSuchBeanDefinitionException : タイプ javax.sql.DataSource の一意の Bean が定義されていません。単一の一致する Bean が予期されていましたが、2 つ見つかりました (firstDs、SecondDs)。
pb は genericDao だと思いますが、よくわかりません。
それを管理する方法は?
ありがとうございました。