fastjson2 序列化报错class com.alibaba.fastjson2.JSONObject cannot be cast to class com.wichatbackapi.domain.LoginUser
时间: 2025-07-05 15:06:28 浏览: 11
### 解决 Fastjson2 序列化类型转换错误
当遇到 `com.alibaba.fastjson2.JSONObject` 无法被强制转换成自定义对象(如 `com.wichatbackapi.domain.LoginUser`)的情况时,通常是因为反序列化过程中丢失了具体的类型信息。为了修复这个问题,可以采取以下几种方法:
#### 方法一:调整 Redis 配置中的序列化方式
如果应用程序使用的是 Spring Boot 和 Redis 的组合,则可以通过配置 RedisTemplate 来指定更合适的序列化器来处理复杂的数据结构。
```java
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> jacksonSer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSer.setObjectMapper(om);
template.setValueSerializer(jacksonSer); // 设置value的序列化规则
template.setKeySerializer(new StringRedisSerializer()); // key采用String的序列化方式
return template;
}
}
```
这种方法通过引入 Jackson 进行序列化/反序列化操作,并开启默认类型的支持,从而解决了 Fastjson 可能带来的兼容性问题[^1]。
#### 方法二:启用 AutoType 功能并设置白名单
对于继续沿用 Fastjson2 的场景下,确保启用了其特有的 AutoType 特性和设置了合理的类名前缀列表是非常重要的。这允许在 JSON 字符串里嵌入完整的 Java 类型信息以便于后续解析。
```properties
# application.properties 或者 yml 文件中加入如下配置项
fastjson.parser.autoTypeSupport=true
fastjson.serializer.features=WriteClassName
```
同时,在项目的常量文件 Constants 中维护好受信任的对象前缀数组,例如:
```java
// Constants.java
public static final String[] JSON_WHITELIST_STR = {"org.springframework", "com.ruoyi"};
```
注意这里的包路径应当覆盖到实际使用的业务逻辑层实体类所在的命名空间,比如上述例子中的 `com.wichatbackapi.domain.LoginUser` 所属的位置也应包含进来[^2]。
#### 方法三:手动控制序列化过程
作为最后的选择,可以在保存数据之前先将其显式地转化为目标类型实例再存入缓存;读取时同样遵循这一原则——即总是创建一个新的 LoginUser 对象并将来自 Redis 的原始 Map 数据填充进去。
```java
// 存储至Redis前的操作
LoginUser loginUser = ...; // 获取登录用户的实例
redisTemplate.opsForValue().set(key, objectMapper.writeValueAsString(loginUser));
// 从Redis取出后的操作
String jsonStr = (String) redisTemplate.opsForValue().get(key);
loginUser = objectMapper.readValue(jsonStr, LoginUser.class);
```
这种方式虽然绕过了直接依赖第三方库特性所带来的风险,但也增加了编码工作量以及潜在的手动映射失误的可能性。
阅读全文
相关推荐


















