ClassCastException: $Proxy445无法转换为Mapper
👉 项目启动时报错:java.lang.ClassCastException: com.sun.proxy.$ProxyXXX cannot be cast to com.xxx.XXMapper
Caused by: java.lang.ClassCastException: com.sun.proxy.$Proxy445
cannot be cast to com.xxx.user.dao.UserMapper
✅ MyBatis动态代理机制:MyBatis通过JDK动态代理生成Mapper接口的实现类
✅ Spring扫描盲区:当Mapper接口所在包未被@MapperScan精准捕获时
✅ 代理对象类型错乱:未被扫描的Mapper会生成错误类型的代理对象(如$Proxy445)
Step 1. 定位Mapper接口的物理路径
真实案例路径: /src/main/java/com/company/module/business/mapper/UserMapper.java
Step 2. @MapperScan配置(支持多级目录)
@SpringBootApplication // ▼▼▼ 重点看这里!三种通配符写法覆盖所有场景 ▼▼▼ @MapperScan({ "com.company.module.*.mapper", // 一级子模块 "com.company.*.*.dao", // 二级嵌套目录 "com.company.**.interfaces.*.mapper" // 多级泛域扫描 }) public class BridgeApplication { public static void main(String[] args) { SpringApplication.run(BridgeApplication.class, args); } }
Step 3. 验证配置
-
通配符潜规则
-
*匹配单级目录 -
**穿透多级目录(关键!)
-
-
IDEA双保险验证法
Ctrl+点击@MapperScan中的路径 → 必须能直达mapper接口文件 -
SpringBoot版本对照表
SpringBoot版本 MyBatis Starter版本 扫描特性 2.5.x 2.2.x 必须显式声明包路径 3.0+ 3.0+ 支持递归扫描
Q:为什么用@Mapper注解也不行?
A:当存在多个数据源时,必须用@MapperScan统一管控扫描范围!
Q:已经配置了路径为何还报错?
A:检查是否开启了@EnableAutoConfiguration导致扫描冲突!
Q:为什么测试环境正常生产却报错?
A:八成是打包时maven过滤了*.java文件,检查target目录是否存在编译后的.class文件
浙公网安备 33010602011771号