package com.enrising.system.domain.vo; import com.enrising.system.domain.SysClient; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import com.enrising.common.excel.annotation.ExcelDictFormat; import com.enrising.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import java.io.Serial; import java.io.Serializable; import java.util.List; /** * 授权管理视图对象 sys_client * * @author Michelle.Chung * @date 2023-05-15 */ @Data @ExcelIgnoreUnannotated @AutoMapper(target = SysClient.class) public class SysClientVo implements Serializable { @Serial private static final long serialVersionUID = 1L; /** * id */ @ExcelProperty(value = "id") private Long id; /** * 客户端id */ @ExcelProperty(value = "客户端id") private String clientId; /** * 客户端key */ @ExcelProperty(value = "客户端key") private String clientKey; /** * 客户端秘钥 */ @ExcelProperty(value = "客户端秘钥") private String clientSecret; /** * 授权类型 */ @ExcelProperty(value = "授权类型") private List<String> grantTypeList; /** * 授权类型 */ private String grantType; /** * 设备类型 */ private String deviceType; /** * token活跃超时时间 */ @ExcelProperty(value = "token活跃超时时间") private Long activeTimeout; /** * token固定超时时间 */ @ExcelProperty(value = "token固定超时时间") private Long timeout; /** * 状态(0正常 1停用) */ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) @ExcelDictFormat(readConverterExp = "0=正常,1=停用") private String status; } 这是我的类定义, /** * 查询客户端管理 */ @Cacheable(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") @Override public SysClientVo queryByClientId(String clientId) { return baseMapper.selectVoOne(new LambdaQueryWrapper<SysClient>().eq(SysClient::getClientId, clientId)); } 这是查询方法,/** * 授权管理Mapper接口 * * @author Michelle.Chung * @date 2023-05-15 */ public interface SysClientMapper extends BaseMapperPlus<SysClient, SysClientVo> { } 这是mapper,
时间: 2025-06-15 07:16:01 浏览: 23
<think>好的,用户之前遇到了修改项目路径后MyBatis查询返回类型不匹配的问题,现在提供了相关的类定义、查询方法和Mapper接口的代码。我需要帮助他分析问题所在。
首先,用户之前的错误是关于Jackson无法找到`org.dromara.system.domain.vo.SysClientVo`这个类,现在用户提供的类路径是`com.enrising.system.domain.vo.SysClientVo`,说明他已经修改了包路径。但错误提示中的旧路径依然存在,说明仍有地方引用了旧的类路径。
接下来需要检查几个方面:
1. **类引用是否正确**:查看提供的代码中是否有地方仍然使用旧路径。用户提供的`SysClientVo`类现在的包是`com.enrising.system.domain.vo`,所以需要确认在Mapper接口、查询方法返回类型、XML配置文件中的`resultType`是否都更新为新路径。
2. **MyBatis配置**:`SysClientMapper`继承了`BaseMapperPlus<SysClient, SysClientVo>`,需要确认`BaseMapperPlus`的泛型参数是否正确引用了新的`SysClientVo`路径。如果`BaseMapperPlus`内部处理返回类型时引用了旧的路径,就会导致问题。
3. **Jackson的多态类型处理**:之前的分析中提到可能使用了`@JsonTypeInfo`注解,但用户提供的`SysClientVo`代码中没有这个注解。可能需要检查父类或接口是否有相关配置,或者是否在其他地方如配置文件中有指定类型信息。
4. **缓存问题**:用户是否清理了项目构建缓存,旧的类可能仍然被编译在target目录中,导致运行时加载了旧类。
5. **XML映射文件**:如果使用了MyBatis的XML文件,检查其中的`resultMap`或`resultType`是否指向新的类路径。
根据用户提供的代码片段,`SysClientVo`类正确使用了新路径,查询方法返回的是`SysClientVo`,而Mapper接口也正确引用了`SysClientVo`。那问题可能出在哪里呢?
可能的原因:MyBatis在生成结果映射时,可能仍然引用旧路径的类。特别是在使用`BaseMapperPlus`时,需要确认其定义是否正确处理了泛型参数。如果`BaseMapperPlus`内部在生成`selectVoOne`方法时,仍然期望旧路径的Vo类,就会导致类型不匹配。
此外,检查项目依赖的其他模块或库是否引用了旧的路径。例如,如果`BaseMapperPlus`来自其他模块,可能需要更新该模块的版本,确保与新路径兼容。
最后,确认所有配置文件,如Spring的组件扫描路径是否包含新的包路径,避免因扫描不到导致类未被正确注册。</think>---
### 问题定位
根据你提供的代码,`SysClientVo`类的新路径是`com.enrising.system.domain.vo`,但报错中仍提示找不到旧路径`org.dromara.system.domain.vo.SysClientVo`。**根本原因可能是以下两点:**
1. **MyBatis的XML映射文件或Mapper接口中残留旧路径引用**
2. **Jackson反序列化时依赖的类元数据(如`@JsonTypeInfo`)未更新**
---
### 详细排查步骤
#### 1. 检查Mapper接口和XML映射文件
确认`SysClientMapper`及其关联的XML文件(如果有)中所有引用`SysClientVo`的地方是否已更新为新路径。
- **检查泛型参数**:
```java
public interface SysClientMapper extends BaseMapperPlus<SysClient, SysClientVo> { ... }
```
确保`BaseMapperPlus`的第二个泛型参数`SysClientVo`的包路径是`com.enrising.system.domain.vo`,而非`org.dromara`。
- **检查XML映射文件**:
如果存在XML文件(如`SysClientMapper.xml`),检查`resultMap`或`resultType`是否指向新路径:
```xml
<select id="selectVoOne" resultType="com.enrising.system.domain.vo.SysClientVo">
...
</select>
```
#### 2. 检查`BaseMapperPlus`的实现
如果`BaseMapperPlus`是自定义的通用Mapper,确认其内部实现是否动态绑定了返回类型。例如:
```java
public class BaseMapperPlus<Entity, VO> {
public VO selectVoOne(...) {
// 是否通过泛型VO的类名动态解析类型?
}
}
```
如果泛型参数`VO`的类名在编译时未更新为新路径,会导致反射加载旧路径的类。
#### 3. 检查Jackson的多态配置
虽然你的`SysClientVo`类代码中未使用`@JsonTypeInfo`,但需检查以下位置:
- **父类或接口**:若`SysClientVo`继承的父类或实现的接口中使用了`@JsonTypeInfo`注解,需同步更新类型标识。
- **全局Jackson配置**:检查是否通过`ObjectMapper`配置了默认类型信息:
```java
objectMapper.activateDefaultTyping(...); // 此类配置会导致类路径硬编码
```
#### 4. 清理编译缓存和IDE缓存
旧路径的编译文件可能残留在`target`或`out`目录中,执行以下操作:
- 执行`mvn clean install`或`gradle clean build`。
- 重启IDE(如IntelliJ IDEA),并清理缓存:
`File -> Invalidate Caches / Restart -> Invalidate and Restart`。
---
### 解决方案
#### 步骤1:全局替换旧路径
在项目中全局搜索`org.dromara.system.domain.vo.SysClientVo`,替换为`com.enrising.system.domain.vo.SysClientVo`,重点关注:
- Mapper接口的泛型参数
- XML映射文件的`resultType`
- 其他VO类或配置文件的依赖引用
#### 步骤2:验证`BaseMapperPlus`的泛型解析
如果`BaseMapperPlus`内部通过泛型动态解析返回类型,确保其实现代码中未硬编码旧路径。例如:
```java
// 错误示例:硬编码旧路径
Class<?> voClass = Class.forName("org.dromara.system.domain.vo.SysClientVo");
// 正确方式:通过泛型获取类
Class<?> voClass = getClass().getGenericSuperclass().getActualTypeArguments()[1];
```
#### 步骤3:检查依赖传递
如果`org.dromara`是其他依赖模块的包名(如第三方JAR包),检查是否因依赖冲突导致旧路径类被错误加载。在`pom.xml`或`build.gradle`中排除旧依赖:
```xml
<dependency>
<groupId>org.dromara</groupId>
<artifactId>old-module</artifactId>
<exclusions>
<exclusion>
<groupId>org.dromara.system</groupId>
<artifactId>system-vo</artifactId>
</exclusion>
</exclusions>
</dependency>
```
---
### 验证是否解决
1. 重新编译并启动项目,触发`queryByClientId`方法。
2. 若仍报错,在反序列化时添加调试断点:
- 在`SysClientVo`的构造方法或字段上打断点,确认该类是否被正确加载。
- 检查序列化后的JSON数据中是否包含旧路径的类名(如`@class: "org.dromara..."`)。
---
### 总结
问题核心是**旧路径的类引用未完全清除**。通过全局替换、清理缓存、检查依赖和Mapper实现,即可解决。若问题依旧,建议提供`BaseMapperPlus`的实现代码和XML映射文件进一步分析。
阅读全文
相关推荐







