Spring boot整合mybatis项目在启动的时候,Dao层注入失败,错误信息如下所示:
***************************
APPLICATION FAILED TO START
***************************
Description:
A component required a bean of type 'com.person.job.admin.dao.XxlJobInfoDao' that could not be found.
Action:
Consider defining a bean of type 'com.person.job.admin.dao.XxlJobInfoDao' in your configuration.
解决方案我采用的是使用注解
@MapperScan("com.person.job.admin.dao")
Spring boot整合mybatis的时候需要做一些配置,同时要继承VFS
配置文件MybatisAutoConfiguration对SqlSessionFactoryBean进行了属性注入
@Configuration
@MapperScan("com.fiberhome.job.admin.dao")
public class MybatisAutoConfiguration {
@Autowired
private Environment env;
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource)
throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
factory.setVfs(SpringBootVFS.class);
factory.setTypeAliasesSuperType(POJO.class);
factory.setTypeAliasesPackage(env.getProperty("mybatis.type-aliases-package"));//指定entity包路径
factory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapper-locations")));//指定xml文件位置
return factory;
}
}
SpringBootVFS继承VFS
public class SpringBootVFS extends VFS {
private final ResourcePatternResolver resourceResolver;
public SpringBootVFS() {
this.resourceResolver = new PathMatchingResourcePatternResolver(getClass().getClassLoader());
}
@Override
public boolean isValid() {
return true;
}
@Override
protected List<String> list(URL url, String path) throws IOException {
Resource[] resources = resourceResolver.getResources("classpath*:" + path + "/**/*.class");
List<String> resourcePaths = new ArrayList<String>();
for (Resource resource : resources) {
resourcePaths.add(preserveSubpackageName(resource.getURI(), path));
}
return resourcePaths;
}
private static String preserveSubpackageName(final URI uri, final String rootPath) {
final String uriStr = uri.toString();
final int start = uriStr.indexOf(rootPath);
return uriStr.substring(start);
}
}