3

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 だと思いますが、よくわかりません。

それを管理する方法は?

ありがとうございました。

4

4 に答える 4

3

構成ファイルの各 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-で遊ぶエイリアシング

于 2012-11-12T14:32:33.757 に答える
0

問題は、データソースの自動配線中に、修飾子を指定していないことです。

 @Autowired


public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);

}

したがって、同じクラスに両方のデータソースが必要な場合は、2 つの異なるセッター インジェクションを使用してそれらを構成し、それぞれの場合に適切な修飾子を提供します。

于 2012-11-13T15:38:56.277 に答える
0

デフォルトでは、自動配線された注釈は Bean のタイプごとにマップされるため、config xml に同じタイプの複数の Bean が存在する場合にどの Bean を配線するかを Spring コンテナーに知らせるために、qualifier("bean id") を使用する必要あります

于 2013-09-30T20:12:58.073 に答える
0

修飾子を追加するよりも洗練された解決策があります。

春:依存性注入からBeanを隠す方法は?

同じインターフェースを実装する 2 つの Bean を自動配線する - デフォルトの Bean を自動配線に設定する方法は?

于 2013-10-16T09:14:22.017 に答える