0

私のxml構成には次のものがあります。コンテナの外部でユニット/統合テストを行っているため、これらをコードに変換したいと思います。

xml:

<bean id="MyMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>
  <property name="dataSource" ref="IbatisDataSourceOracle"/>
 </bean>

<bean id="IbatisDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/my/mydb"/>
</bean>

上記のxmlからものを取得するために使用したコード:

this.setSqlMapClient((SqlMapClient)ApplicationInitializer.getApplicationContext().getBean("MyMapClient"));

私のコード(単体テスト用):

SqlMapClientFactoryBean bean = new SqlMapClientFactoryBean();
UrlResource urlrc = new UrlResource("file:/data/config.xml");
bean.setConfigLocation(urlrc);
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@123.210.85.56:1522:ORCL");
dataSource.setUsername("dbo_mine");
dataSource.setPassword("dbo_mypwd");
bean.setDataSource(dataSource);

SqlMapClient sql = (SqlMapClient) bean; //code fails here

xml が使用されている場合SqlMapClientは、セットアップするクラスであり、どうして変換SqlMapClientFactoryBeanできないのですか?SqlMapClient

4

3 に答える 3

1

SqlMapClientFactoryBeanFactoryBeanです。SqlMapClient インターフェース自体は実装しませんが、getObject() メソッドが呼び出されたときに返される SqlMapClient のインスタンスを作成します。Spring コンテナーは FactoryBean を認識しており、呼び出し元の観点から通常の Bean のように見えるようにします。コンテナの外で FactoryBean を使用してもうまくいくかどうかはわかりません。コンテナのライフサイクルの外で getObject() を呼び出すと、「初期化されていません」という例外が発生する可能性があります ...

テストケース用に別の簡素化された Spring 構成を作成し、それをインスタンス化し、そこから Bean を取得してみませんか? または、Spring 以外の方法で SqlMapClient を作成し、DAO に設定することもできます。

于 2009-11-11T07:44:19.270 に答える
0
SqlMapClientFactoryBean factory = new SqlMapClientFactoryBean();
factory.setConfigLocation(YOUR_SQL_MAP_CONFIG_RESOURCE);
factory.afterPropertiesSet(); //omitting try/catch code
client = (SqlMapClient)factory.getObject();

出来上がり

于 2010-05-25T23:11:51.793 に答える