как настроить mybatis в springboot

У меня есть две конфигурации здесь:

@Configuration
public class DataConfig {

@Value("${datasource.jdbcUrl}")
private String jdbcUrl;
@Value("${datasource.username}")
private String username;
@Value("${datasource.password}")
private String password;
@Value("${datasource.driverClassName:com.mysql.jdbc.Driver}")
private String driverClassName;
@Value("${datasource.initialSize:20}")
private int initialSize;
@Value("${datasource.maxActive:30}")
private int maxActive;
@Value("${datasource.minIdle:20}")
private int minIdle;
@Value("${datasource.transactionTimeoutS:30}")
private int transactionTimeoutS;

@Value("${datasource.basePackage:com.tg.ms.mapper}")
private String basePackage;
@Value("${datasource.mapperLocations}")
private String mapperLocations;


@Bean
public DataSource dataSource() {
    DruidDataSource ds = new DruidDataSource();
    ds.setMaxWait(maxWait);
    ds.setValidationQuery(validationQuery);
    ds.setRemoveAbandoned(removeAbandoned);
    ds.setRemoveAbandonedTimeout(removeAbandonedTimeout);
    ds.setTestWhileIdle(testWhileIdle);
    ds.setTestOnReturn(testOnReturn);
    ds.setTestOnBorrow(testOnBorrow);
    ds.setMinIdle(minIdle);
    return ds;
}


@Bean
public SqlSessionFactory sqlSessionFactoryBean() throws Exception {

    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource());

    PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

    sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mybatis/*.xml"));

    return sqlSessionFactoryBean.getObject();
}

---------- Другой конфиг -------------

@Configuration
@AutoConfigureAfter(DataBaseConfig.class)
public class MapperScannerConfig {

@Value("${datasource.basePackage:com.tg.ms.mapper}")
private String basePackage;


@Bean
public MapperScannerConfigurer BPMapperScannerConfigurer() {
    System.out.println("mapper--1.----******----"+basePackage+"----*******");
    MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
    mapperScannerConfigurer.setBasePackage("com.tg.mapper");
    mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
    return mapperScannerConfigurer;
}
}
  1. Могу ли я вставить @Bean public MapperScannerConfigurer BPMapperScannerConfigurer() в DataConfig? Я пытаюсь, но напечатать:

    Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testController': Unsatisfied dependency expressed through field 'testMapper'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testMapper' defined in file [/Users/twogoods/codesource/mainetset/target/classes/com/tg/mapper/TestMapper.class]: Cannot resolve reference to bean 'sqlSessionFactoryBean' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactoryBean' defined in class path resource [com/tg/config/DataConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.ibatis.session.SqlSessionFactory]: Factory method 'sqlSessionFactoryBean' threw exception; nested exception is java.lang.NullPointerException

  2. MapperScannerConfig инициализируется раньше, чем DataConfig, получаю из журнала печати, @Value("${datasource.basePackage:com.tg.ms.mapper}") private String basePackage; не могу получить значение(в DataConfig можно получить), использую @AutoConfigureAfter бесполезно, MapperScannerConfig тоже раньше, не могу настроить mapper basePackage

    журнал:Cannot enhance @Configuration bean definition 'BPMapperScannerConfigurer' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.


person twogoods    schedule 17.10.2016    source источник
comment
Добавьте полную трассировку стека.   -  person M. Deinum    schedule 17.10.2016
comment
Вы взглянули на это? github.com/mybatis/spring-boot-starter   -  person Ian Lim    schedule 19.10.2016


Ответы (1)


У меня та же проблема. MapperScannerConfigurer инициализируется слишком рано в весенней среде, и я думаю, что это приводит к тому, что аннотация @AutoConfigureAfter становится бесполезной. Поэтому я решаю это так: избегайте использования MapperScannerConfigurer: двумя способами:

  1. просто используйте @MapperScan("com.a.b.package")

  2. используйте аннотацию @org.apache.ibatis.annotations.Mapper в интерфейсе картографа mybatis.

person zhaohuatai    schedule 19.11.2016