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. 验证配置

text
复制
✅ 正确姿势:com.[公司名].[项目名].[模块名].mapper
❌ 典型错误:com.company.module.mapper (缺少业务层目录)
  1. 通配符潜规则

    • * 匹配单级目录

    • ** 穿透多级目录(关键!)

  2. IDEA双保险验证法
    Ctrl+点击@MapperScan中的路径 → 必须能直达mapper接口文件

  3. 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文件

posted @ 2023-03-08 10:14  三苇渡江  阅读(317)  评论(0)    收藏  举报