写点什么

多模块项目 mybatis mapper bean 找不到问题

作者:Z冰红茶
  • 2022 年 4 月 13 日
  • 本文字数:1278 字

    阅读完需:约 4 分钟

项目背景,多模块项目,且每个模块的 package 路径不一样,每个模块都用到了 mybatis


错误描述如下,大体意思是需要一个 Mapper bean 但是没有找到

Description:Field syncLogMapper in com.pansoft.data.sync.gateway.SyncLogGatewayImpl required a bean of type 'com.pansoft.data.sync.gateway.SyncLogMapper' that could not be found.The injection point has the following annotations:	- @org.springframework.beans.factory.annotation.Autowired(required=true)Action:Consider defining a bean of type 'com.pansoft.data.sync.gateway.SyncLogMapper' in your configuration.
复制代码

排查问题

1、Mapper 接口类存在,且加了 @Mapper 注解

2、Mapper 对应的 xml 文件也存在,且命名空间没有问题

3、写了个测试用例,单独跑 mybatis 是可以测试通过

经过以上 3 个步排查,可以排除 mybatis 本身,那么就有可能是 spring 与 mybatis 集成问题

由于报错的模块的 package,与启动类所在的 package 路径不一样,所以加了一个 mybatis 的配置类,添加 MapperScan

主要用于配置 mybatis 的扫描路径

@Configuration@MapperScan(basePackages = {"com.pansoft.idx.meta.**", "com.pansoft.data.sync.**"})public class MybatisConfig {
}
复制代码

然后启动应用,加上这个配置类确实起作用了,但是又出现了其他的问题,

Description:Field iCvtDiffenenceService in com.pansoft.idx.meta.controller.CvtDifferenceController required a single bean, but 2 were found:	- cvtDifferenceServiceImpl: defined in file [E:\WorkSpace\PansoftGitLab\ps-erp\index-core\index-meta\index-meta-app\target\classes\com\pansoft\idx\meta\service\CvtDifferenceServiceImpl.class]	- ICvtDiffenenceService: defined in file [E:\WorkSpace\PansoftGitLab\ps-erp\index-core\index-meta\index-meta-client\target\classes\com\pansoft\idx\meta\api\ICvtDiffenenceService.class]Action:Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
复制代码

大体意思,同一个接口出现了两个实现,查看源码发现,就是一个接口一个实现,而且日志里也是一个接口一个实现,只能查看源码,通过查看 org.mybatis.spring.mapper.MapperScannerConfigurer 源码

MapperScannerConfigurer->ClassPathBeanDefinitionScanner->ClassPathScanningCandidateComponentProvider,可以发现(其实看的眼花缭乱),如果只配置扫描路径的话,会把路径的所有类都注册到 spring 容器,不过 MapperScan 还提供了多种过滤机制,使用最简单的注解方式,在刚才的基础上加上“nnotationClass = Mapper.class”,即只扫描有 Mapper 注解的类到 spring 容器

@Configuration@MapperScan(basePackages = {"com.pansoft.idx.meta.**", "com.pansoft.data.sync.**"}, annotationClass = Mapper.class)public class MybatisConfig {
}
复制代码

然后再次启动应用,这次可以成功启动了,发送请求测试,可以正常访问了,(*^▽^*)

总结,mybatis 基础不扎实

发布于: 刚刚阅读数: 3
用户头像

Z冰红茶

关注

还未添加个人签名 2018.09.17 加入

还未添加个人简介

评论

发布
暂无评论
多模块项目 mybatis mapper bean 找不到问题_Z冰红茶_InfoQ写作平台