当前位置: 首页 > news >正文

【Spring Boot 多模块项目】@MapperScan失效、MapperScannerConfigurer 报错终极解决方案

在使用 Spring Boot 构建多模块项目,集成 MyBatis-Plus 时,很多开发者会遇到类似如下启动报错:

Error creating bean with name 'mapperScannerConfigurer' ...
Caused by: java.lang.IllegalArgumentException: Property 'basePackage' is required

即使在启动类上正确添加了 @MapperScan("com.xxx.mapper"),项目依然报错无法启动。这到底是怎么回事?我们该如何优雅地配置 Mapper 扫描?本文将逐步分析问题成因,最后给出推荐方案。


一、问题背景

项目结构如下(典型的多模块结构):

parent
├── common              # 公共模块,封装配置类等
├── user                # 业务模块,包含启动类、Mapper 接口
└── pom.xml

user 模块中有如下启动类:

@SpringBootApplication
@MapperScan("com.partner.user.mapper")
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}

common 模块中配置了如下 MybatisPlusConfig

@Configuration
@EnableConfigurationProperties(MyBatisPlusProperties.class)
public class MybatisPlusConfig {@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(MyBatisPlusProperties myBatisPlusProperties) {System.out.println("Mapper scan package: " + myBatisPlusProperties.getMapperScan());MapperScannerConfigurer configurer = new MapperScannerConfigurer();configurer.setBasePackage(myBatisPlusProperties.getMapperScan());return configurer;}
}

配置类依赖的配置文件如下(写在 user 模块的 bootstrap.yml):

mybatis:mapperScan: com.partner.user.mapper

二、项目启动失败的根本原因

启动失败栈信息:

Caused by: java.lang.IllegalArgumentException: Property 'basePackage' is required

也就是说:MapperScannerConfigurer 没有成功读取到 basePackage,传入的是 null。从而导致 afterPropertiesSet() 抛出异常。

根本原因是:

MapperScannerConfigurer 是一个 Spring Bean,提前初始化,但它依赖的 mybatis.mapperScan 配置却定义在 bootstrap.yml 中,属于 Spring Cloud 的配置生命周期,尚未加载完成,导致值为 null


三、常见误区总结

错误实践原因
配置 MapperScannerConfigurer 并从 bootstrap.yml 读取 mapperScan配置未加载时就被调用,null 值引发异常
在多个模块分别配置 mapper 扫描路径不同模块配置加载顺序不确定,容易互相覆盖或无效
同时使用 @MapperScanMapperScannerConfigurer存在重复扫描、不一致行为风险

四、推荐解决方案

✅ 推荐做法:只使用 @MapperScan 注解,彻底抛弃 MapperScannerConfigurer

这是最简洁、最稳定的做法,推荐如下方式:

1. 在启动类中添加注解:
@SpringBootApplication
@MapperScan("com.partner.user.mapper") // 替换为你自己的 mapper 包路径
public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}
}
2. 删除 MapperScannerConfigurer 相关 Bean:
// ❌ 删除该 Bean,否则仍然会因配置未加载而报错
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(...) {...
}

这样一来,MyBatis-Plus 会根据注解自动扫描 Mapper 接口,避免复杂配置和潜在异常。


五、其他可选做法(不推荐)

如果你确实有特殊需求,想动态配置扫描路径,也应注意以下几点:

  1. 配置写在 application.yml 而非 bootstrap.yml,确保其生命周期早于 Bean 初始化;

  2. 或使用 Spring Boot 2.2+ 的 @ConfigurationPropertiesScan 自动扫描配置类

示例:

@ConfigurationProperties(prefix = "mybatis")
public class MyBatisPlusProperties {private String mapperScan;
}@Configuration
@ConfigurationPropertiesScan("com.partner.common.config")
public class MybatisPlusConfig {...
}

六、总结建议

方案是否推荐说明
@MapperScan("xxx") 注解✅ 推荐简单高效,避免生命周期问题
自定义配置类读取扫描包路径❌ 不推荐配置不易统一,生命周期难控制
多模块共用一个配置类 + 注解扫描✅ 推荐公共模块做分页拦截器等配置,Mapper 扫描交给启动类注解

七、写在最后

在实际开发中,越是多模块复杂项目,越应该避免不必要的配置项和手动扫描逻辑。优雅使用 @MapperScan 是最稳定的 MyBatis 配置方案。

如果你也遇到了类似的问题,希望这篇文章能帮你少走弯路!


📌如果本文对你有帮助,欢迎点赞、收藏、评论支持一下!

📮如有更多 Spring Boot 多模块踩坑问题,欢迎留言交流~

相关文章:

  • window 显示驱动开发-处理内存段(二)
  • Linux系统下使用Kafka和Zookeeper
  • 中介者模式(Mediator Pattern)详解
  • TI AM243X开发流程
  • 【Python 字符串】
  • 大模型的应用中A2A(Agent2Agent)架构的部署过程,A2A架构实现不同机器人之间的高效通信与协作
  • Redis 重回开源怀抱:开源精神的回归与未来展望
  • 仓储车间安全革命:AI叉车防撞装置系统如何化解操作风险
  • 中科院开源:多智能体 + 知识图谱,自动生成高质量医学数据
  • SAP 交货单行项目含税金额计算报cx_sy_zerodivide处理
  • 【人工智能】低代码与AI技术未来趋势分析
  • Redis 8.0正式发布,再次开源为哪般?
  • SQL:MySQL函数:字符串函数
  • 深入解析:如何正确处理业务空值与技术异常?从避免滥用`None`和`WebDriverException`谈起
  • ERC-20与ERC-721:区块链代币标准的双星解析
  • 【知识点】三维项目中关于各种坐标系的初步认识
  • 2.3 点云数据存储格式——LiDAR专用型点云存储格式
  • 【Linux网络】Socket 编程预备
  • 极简远程革命:节点小宝 — 无公网IP的极速内网穿透远程解决方案
  • 用NVivo革新企业创新:洞悉市场情绪,引领金融未来
  • 眉山“笑气”迷局:草莓熊瓶背后的隐秘与危机
  • 洛杉矶奥组委确认2028年奥运会和残奥会开闭幕式场地
  • 美联储宣布维持基准利率不变
  • 李彦宏:技术迭代速度之快从业30年来未见过,要提升执行力战胜对手
  • 宁波市人大常委会审议生育工作报告,委员建议学前教育免费
  • 观察|印巴交火开始升级,是否会演变为第四次印巴战争?