使用类路径在spring-mybatis中配置映射器位置:*

问题描述

所以我要这个工作

@Bean
@ConfigurationProperties("datasource.mybatis-factory")
public sqlSessionfactorybean sqlSessionfactorybean() {
  sqlSessionfactorybean sqlSessionfactorybean = new sqlSessionfactorybean();
  sqlSessionfactorybean.setDataSource(dataSource());
  return sqlSessionfactorybean;
}

具有财产(以及其他)

datasource.mybatis-factory.mapper-locations=classpath*:sqlmap/*.xml

但是,即使文件存在,它也会失败:

Caused by: java.io.FileNotFoundException: class path resource [classpath*:sqlmap/*.xml] cannot be opened because it does not exist

看着setMapperLocations()我没做错什么,他们显然希望我使用classpath*:...

/**
 * Set locations of MyBatis mapper files that are going to be merged into the {@code sqlSessionFactory} configuration
 * at runtime.
 *
 * This is an alternative to specifying "<sqlmapper>" entries in an MyBatis config file. This property being
 * based on Spring's resource abstraction also allows for specifying resource patterns here: e.g.
 * "classpath*:sqlmap/*-mapper.xml".
 *
 * @param mapperLocations
 *          location of MyBatis mapper files
 */
public void setMapperLocations(Resource... mapperLocations) {
  this.mapperLocations = mapperLocations;
}

再往下看代码

    for (Resource mapperLocation : this.mapperLocations) {
      if (mapperLocation == null) {
        continue;
      }
      try {
        XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(mapperLocation.getInputStream(),targetConfiguration,mapperLocation.toString(),targetConfiguration.getsqlFragments());
        xmlMapperBuilder.parse();

没有代码可以将classpath*:sqlmap/*.xml转换为可打开的资源,或者至少我看不到。还是我在这里想念什么?

解决方法
我现在拥有并且正在工作的东西(请注意,我不使用datasource.mybatis-factory.mapper-locations,因为那样会再次覆盖我设置的内容

@Bean
@ConfigurationProperties("datasource.mybatis-factory")
public sqlSessionfactorybean sqlSessionfactorybean(
    @Value("${datasource.mybatis-factory.mapper-location-pattern}") String mapperLocations) {
  sqlSessionfactorybean sqlSessionfactorybean = new sqlSessionfactorybean();
  sqlSessionfactorybean.setDataSource(dataSource());
  sqlSessionfactorybean.setMapperLocations(findMapperLocations(mapperLocations));
  return sqlSessionfactorybean;
}

private Resource[] findMapperLocations(String resourcePaths) {
  PathMatchingResourcePatternResolver patternResolver = new PathMatchingResourcePatternResolver();
  return Stream.of(resourcePaths.split(","))
      .map(LambdaExceptionUtilities.rethrowFunction(patternResolver::getResources))
      .flatMap(Stream::of)
      .toArray(Resource[]::new);
}

具有属性

datasource.mybatis-factory.mapper-location-pattern=classpath*:sqlmap/*.xml

所以:要使它无需解决,这里缺少什么?类路径上的XML如何找到进入MyBatis的途径?也许春天靴子缺少了什么?

解决方法

你的财产应该是这样的。 如果您使用默认配置,

mybatis.mapper-locations: classpath*:sqlmap/**/*.xml

如果你像上面提到的那样使用自己的,

datasource.mybatis-factory.mapper-locations= classpath*:sqlmap/**/*.xml
,

这是一个有效的示例代码,你可以从中得到一个想法。

@Configuration
@MapperScans(
        {

                @MapperScan(
                        basePackages = {"com.example.seeker.repository"},sqlSessionFactoryRef = "sqlSessionFactorySeeker",sqlSessionTemplateRef = "sqlSessionTemplateSeeker"
                )
        }
)
public class SeekerDataSourceConfig {
    @Autowired
    Environment environment;

    @Bean(value = "dsSeeker")
    @ConfigurationProperties(prefix = "spring.datasource.seeker")
    DataSource dsSeeker() {
        return DataSourceBuilder.create().build();
    }

    @Qualifier("dsSeeker")
    @Autowired
    private DataSource dsSeeker;

    @Bean(value = "sqlSessionFactorySeeker")
    public SqlSessionFactory sqlSessionFactorySeeker() {
        SqlSessionFactory sessionFactory = null;
        try {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            PathMatchingResourcePatternResolver pathM3R = new PathMatchingResourcePatternResolver();
            bean.setMapperLocations(pathM3R.getResources("classpath*:sqlmap/**/*.xml"));
            bean.setDataSource(dsSeeker);
            sessionFactory = bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sessionFactory;
    }

    @Bean(value = "sqlSessionTemplateSeeker")
    public SqlSessionTemplate sqlSessionTemplateSeeker() {
        return new SqlSessionTemplate(sqlSessionFactorySeeker());
    }

    @Bean(name = StaticResource.TxManager.TX_MANAGER_SEEKER)
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(dsSeeker);
    }

}

属性文件

spring.datasource.seeker.jdbc-url=jdbc:mysql://*********
spring.datasource.seeker.username=seeker***
spring.datasource.seeker.password=ewfky4eyrmggxbw6**
spring.datasource.seeker.driver-class-name=com.mysql.cj.jdbc.Driver

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...