Spring 4, MyBatis, несколько источников данных с аннотациями

В настоящее время я работаю в приложении 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 были разделены. Это мое единственное препятствие прямо сейчас.


person el n00b    schedule 28.01.2016    source источник
comment
Я посмотрел на это и не уверен, что делаю неправильно: stackoverflow.com/questions/18201075/   -  person el n00b    schedule 28.01.2016


Ответы (2)


Используйте шаблон DAOFactory, чтобы получить соединения для нескольких источников данных, таких как DS1 и DS2, и используйте класс DAOUtil для обеспечения необходимой конфигурации с помощью аннотации.

person Harisudan Kuppusami    schedule 28.01.2016
comment
В настоящее время у меня нет возможности изменить способ настройки первого источника данных. Это один из тех кодов, которые будут отклонены, если вы не будете следовать уже существующим сценариям. - person el n00b; 28.01.2016

Вы можете использовать ace-mybatis, это упрощает настройку.

Добавьте одну фасоль.

@Bean
public static AceMapperScannerConfigurer mapperScannerConfigurer() {
    return AceMapperScannerConfigurer.builder()
            .basePackage("com.myproject.package1")
            .build();
}

Затем отметьте свои интерфейсы картографа с помощью @AceMapper и укажите sqlSessionFactory.

@AceMapper(sqlSessionFactoryBeanName = "firstSqlSessionFactory")
public interface UserMapper {
 Stream<User> selectUsers();
}

@AceMapper(sqlSessionFactoryBeanName = "secondSqlSessionFactory")
public interface ClientMapper {
 Stream<Client> selectClients();
}
person Dmytro Marchenko    schedule 25.01.2017