как установить SqlMapClient вне пружины xmls - PullRequest
0 голосов
/ 11 ноября 2009

У меня есть следующее в моих конфигурациях xml. Я хотел бы преобразовать их в свой код, потому что я выполняю некоторое модульное / интеграционное тестирование вне контейнера.

XMLs:

<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>

код, который я использовал для извлечения вещей сверху xmls:

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

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

SqlMapClientFactoryBean является FactoryBean . Он не реализует сам интерфейс SqlMapClient, но производит экземпляры SqlMapClient, которые возвращаются при вызове его метода getObject (). Контейнер Spring знает о FactoryBeans и делает их похожими на обычные bean-компоненты с точки зрения вызывающей стороны. Я не уверен, что использование FactoryBean вне контейнера будет работать - вы можете получить исключение «не инициализировано», если вызовите getObject () вне жизненного цикла контейнера ...

Почему бы не создать отдельную урезанную конфигурацию Spring для ваших тестовых случаев, создать ее экземпляр и получить от нее компоненты? В качестве альтернативы, вы можете создать SqlMapClient не Spring и установить его на своем DAO

0 голосов
/ 10 августа 2013

Я хочу добавить, что сработало для меня. Пришлось работать с некоторым устаревшим кодом, и пока я не смогу перейти на MyBatis, я хочу преобразовать старый applicationContext xml в весенние классы @Configuration.

@Bean
public SqlMapClient sqlMap() throws Exception
{

    SqlMapClientFactoryBean factory = new SqlMapClientFactoryBean();
    factory.setConfigLocation(new ClassPathResource("conf/ibatis.xml"));
    DataSource dataSource                   = this.dataSource;
    factory.setDataSource(dataSource);
    factory.afterPropertiesSet();
    return (SqlMapClient) factory.getObject();
}
0 голосов
/ 26 мая 2010
SqlMapClientFactoryBean factory = new SqlMapClientFactoryBean();
factory.setConfigLocation(YOUR_SQL_MAP_CONFIG_RESOURCE);
factory.afterPropertiesSet(); //omitting try/catch code
client = (SqlMapClient)factory.getObject();

вуаля

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...