SpringBoot在使用tk.mybatis.mapper报错

本文介绍在SpringBoot项目中引入通用Mapper(tk.mybatis.mapper)时遇到的问题及解决办法。主要涉及MyMapper接口的设计、Nacos配置文件路径设置、@MapperScan注解使用等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot项目引入通用mapper(tk.mybatis.mapper)的时候踩的坑:

报错信息:
java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

看到这个错误信息,需要查看我们引用的mybatis的配置文件:

第一步查看MyMapper:

package com.mybatis;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
 * 特别注意,该接口不能被扫描到,否则会出错 继承自己的MyMapper
 *
 * @param <T>
 */
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}

注意一下,这个MyMapper的路劲;

第二步查看nacos中我们配置的mybatis的路劲:

mybatis:
  type-aliases-package: com.**.entity
  mapper-locations: classpath*:mappers/*.xml
  configuration:
    map-underscore-to-camel-case: true
    use-generated-keys: true
mapper:
  mappers:
    - com.xxx.mybatis.MyMapper
  not-empty: false
  identity: MYSQL
  style: normal

在这里插入图片描述
启动类引入的@MapperScan 引入的是import tk.mybatis.spring.annotation.MapperScan;

同时要注意 @MapperScan里的basePackage不能包含通用mapper(我的是BaseDao)的路径,只包含其他的mapper的路径,不然会报错

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘baseDao’ defined in file [BaseDao.class]: Invocation of init method failed;

nested exception is tk.mybatis.mapper.MapperException: tk.mybatis.mapper.MapperException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

<think>好的,用户遇到了MyBatisMapper方法返回类型不支持的问题,具体错误信息是“Mapper method 'com.recruitment.mapper.AdminMapper.deleteById1' has an unsupported return type”。首先,我需要分析可能的原因。根据提供的引用内容,有几个常见的可能性。 首先,检查方法返回类型是否与MyBatis支持的类型匹配。引用[4]提到,如果返回类型是原始类型(如int)但方法可能返回null,就会报错。比如,如果AdminMapper.deleteById1声明为int,但实际数据库操作可能返回null,就会有问题。这种情况下,应该将返回类型改为包装类型Integer,允许返回null值,如引用[4]中的例子所示。 其次,检查SQL操作是否确实返回了结果。例如,删除操作通常返回受影响的行数,但如果配置错误,可能导致返回null。需要确保对应的XML映射文件中的SQL语句正确,使用正确的标签如<delete>,并检查是否误用了resultType属性,这可能导致MyBatis无法正确映射结果。 另外,查看是否存在方法重载的问题。引用中未直接提到,但方法名deleteById1可能与其他方法产生冲突,尤其是如果存在重载但参数不同的方法,可能会导致MyBatis无法正确解析。需要确认方法名是否唯一,或者是否存在拼写错误。 还有包扫描的问题。引用[5]指出,如果@MapperScan导入了错误的包(如org.mybatis.spring.annotation而不是tk.mybatis.spring.annotation),会导致Mapper接口无法正确注册。用户应检查启动类上的注解是否正确,确保使用了正确的包路径。 此外,还要考虑MyBatis版本兼容性问题。不同版本对返回类型的处理可能不同,确保使用MyBatis和相关依赖(如tk.mybatis.mapper)版本一致,并查看是否有已知的bug或配置要求。 最后,建议用户检查XML映射文件中的SQL语句是否正确,特别是deleteById1对应的SQL是否存在语法错误或配置错误,确保操作返回的是整数类型的结果,而不是null。同时,检查日志中的详细错误信息,确认是否有其他潜在问题,如数据库连接问题或权限问题。 总结下来,可能的解决步骤包括:修改返回类型为Integer,检查SQL配置,确保方法名唯一,验证包扫描设置,检查依赖版本,以及审查XML映射文件。用户应逐一排查这些方面,以解决返回类型不支持的问题。</think>### 解决MyBatis Mapper方法返回类型不支持的问题 #### 问题分析 错误信息`Mapper method 'com.recruitment.mapper.AdminMapper.deleteById1' has an unsupported return type`表明以下可能原因: 1. **返回类型与操作不匹配**:例如,删除操作通常返回`int`(受影响的行数),但方法声明可能误用了`void`或实体类[^4]。 2. **原始类型与包装类型冲突**:若方法返回`int`但实际可能返回`null`,会导致类型不兼容[^1][^2]。 3. **方法重载或映射配置错误**:XML映射文件中未正确关联SQL语句或方法名冲突。 --- #### 逐步解决方案 ##### 1. **检查方法返回类型** - **删除/更新操作**应返回`int`或`Integer`,而非实体类。例如: ```java // AdminMapper接口 Integer deleteById1(Integer id); // 使用包装类型避免null问题[^4] ``` - **插入操作**若需要返回自增主键,需通过`@Options`或XML配置`useGeneratedKeys`。 ##### 2. **验证SQL映射配置** 在`AdminMapper.xml`中,确保SQL标签(如`<delete>`)与操作匹配,且未错误添加`resultType`: ```xml <delete id="deleteById1"> DELETE FROM admin WHERE id = #{id} </delete> ``` ##### 3. **避免方法重载** MyBatis不支持方法重载,需确保方法名唯一: ```java // 错误示例 void deleteById1(Integer id); int deleteById1(Integer id); // 重载会导致解析失败 // 正确示例 int deleteById1(Integer id); // 仅保留一个方法 ``` ##### 4. **检查@MapperScan包路径** 若使用`tk.mybatis`,需确保启动类引用正确的包: ```java // SpringBoot启动类 @MapperScan(basePackages = "com.recruitment.mapper", markerInterface = Mapper.class) // 注意:应使用tk.mybatis.spring.annotation.MapperScan[^5] ``` ##### 5. **依赖版本兼容性** 确认`mybatis`和`tk.mybatis.mapper`版本匹配(例如`mybatis 3.5.x` + `tk.mybatis.mapper 4.2.x`)。 --- #### 总结 通过调整返回类型、修正XML配置、确保方法唯一性及包扫描正确性,可解决该问题。若仍报错,需检查SQL执行日志,确认是否因数据库操作实际返回了`null`。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值