В настоящее время я работаю в приложении Spring 4, которое использует MyBatis и полностью основано на аннотациях (которые не могут меняться в соответствии с требованиями архитектуры). Я пытаюсь добавить второе определение источника данных с совершенно отдельным набором конфигураций сопоставления.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить два источника данных хорошо работать вместе.
Я создал новый, практически идентичный класс и добавил @Qualifier
данных в новый файл.
Конфигурация классов выглядит так:
Источник данных 1
@Configuration
@MapperScan (basePackages = "com.myproject.package1", annotationClass = Mapper.class)
public class DataSource1 {
@Bean
@Qualifier ("DS1")
public DataSource getDataSource() {
/* configuration loaded */
}
@Bean
@Qualifier ("DS1")
public SqlSessionFactory getSqlSessionFactory() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(getDataSource());
/* mapper resources added */
return bean.getObject();
}
}
Источник данных 2
@Configuration
@MapperScan (basePackages = "com.myproject.package2", annotationClass = Mapper.class)
public class DataSource2 {
@Bean
@Qualifier ("DS2")
public DataSource getDataSource() {
/* configuration loaded */
}
@Bean
@Qualifier ("DS2")
public SqlSessionFactory getSqlSessionFactory() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(getDataSource());
/* mapper resources added */
return bean.getObject();
}
}
Когда это запускается, я получаю сообщения об исключениях, например:
org.apache.ibatis.binding.BindingException: неверный связанный оператор (не найден)
Если я закомментирую данные в DS2, DS1 снова будет работать нормально. Я попытался добавить данные конфигурации сканирования картографа в другой компонент и установить имя SqlSessionFactoryBean
для передачи в него, но это не сработало.
Предложения?
ОБНОВИТЬ
Я просмотрел это сообщение и обновил его, чтобы использовать следующий.
@Bean (name = "the_factory_1")
public SqlSessionFactory getSqlSessionFactory() { /* same code */ }
@Bean
public MapperScannerConfigurer getMapperScannerConfigurer() {
MapperScannerConfigurer configurer = new MapperScannerConfigurer();
configurer.setBasePackage("com.myproject.package1");
configurer.setAnnotationClass(Mapper.class);
configurer.setSqlSessionFactoryBeanName("the_factory_1");
return configurer;
}
Однако это приводит меня к этой ошибке:
Для зависимости не найден подходящий bean-компонент типа [com.myproject.package1.mapper.MyMapper]: ожидается по крайней мере 1 bean-компонент, который квалифицируется как кандидат автоподключения для этой зависимости. Аннотации зависимостей: {}
Когда я отлаживаю, вызывается только один @Bean
для фабрики.
ОБНОВЛЕНИЕ 2
Если я перемещаю все в один файл, все в порядке. Однако это не идеально, поскольку я хочу, чтобы определения DataSource
были разделены. Это мое единственное препятствие прямо сейчас.