java.util.LinkedHashMap is in module java.base of loader ‘bootstrap‘; com.atguigu.common.to.SkuHasSt

java.util.LinkedHashMap is in module java.base of loader ‘bootstrap’; com.atguigu.common.to.SkuHasStockVo is in unnamed module of loader ‘app’

原因:
因为他解析json时将类型转为了linkedHashmap了,而不是转为你需要的实体类来封装,
因此只要一遍历就会报错。
在这里插入图片描述
解决办法:
将数据重新转为json,然后再转回来就行了

 String s = JSON.toJSONString(skuHasStockVos); //json转换有问题,需要重新转,并指明类型
 List<SkuHasStockVo> skuHasStockVos1 = JSON.parseArray(s, SkuHasStockVo.class);// 指定转换的类型

在这里插入图片描述
发现正常了。

### RedisJava 类型转换异常分析 在处理 Redis 数据存储时,`java.lang.ClassCastException: LinkedHashMap cannot be cast to ...` 是常见的错误之一。这种问题通常发生在序列化和反序列化过程中,当数据被写入 Redis 和读取出来时未能保持一致的数据结构。 #### 错误原因解析 该错误的根本原因是 Redis 存储的是键值对形式的字节流,在默认情况下,Java 使用 `LinkedHashMap` 来表示哈希类型的值[^1]。如果应用程序期望从 Redis 获取的对象是一个自定义类实例而非 `LinkedHashMap`,则会抛出 `ClassCastException` 异常。 以下是可能的原因及其解决方案: --- ### 解决方案一:指定正确的序列化器 为了防止类型不匹配的情况发生,可以配置 Redis 客户端使用的序列化方式。例如,Jedis 或 Lettuce 都支持多种序列化选项,推荐使用 `Jackson` 或 `Gson` 进行 JSON 序列化/反序列化操作。 ```java import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; public class RedisConfig { public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); // 设置 Jackson 作为序列化工具 GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(); template.setDefaultSerializer(serializer); return template; } } ``` 上述代码片段展示了如何通过 Spring Data Redis 的 `GenericJackson2JsonRedisSerializer` 将对象自动转化为 JSON 字符串并保存到 Redis 中。 --- ### 解决方案二:手动控制序列化与反序列化过程 如果不希望依赖框架实现,则可以通过反射机制动态加载目标类,并完成相应的转化工作。下面是一段基于反射技术的手动序列化解码逻辑示例: ```java import java.io.*; import java.util.Properties; public class ReflectionUtil { @SuppressWarnings("unchecked") public static <T> T deserialize(byte[] data, String className) throws Exception { ObjectInputStream ois = null; try (ByteArrayInputStream bis = new ByteArrayInputStream(data)) { ois = new ObjectInputStream(bis); Object obj = ois.readObject(); // 判断实际类型是否为目标类型 if (!obj.getClass().getName().equals(className)) { throw new ClassCastException("Type mismatch during deserialization"); } return (T) obj; // 返回强转后的结果 } finally { if (ois != null) { ois.close(); } } } public static byte[] serialize(Object object) throws IOException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(object); oos.flush(); return bos.toByteArray(); } } ``` 此方法允许开发者显式声明待恢复的目标类型名称,从而减少因隐含假设而导致的风险。 --- ### 解决方案三:调整业务设计避免复杂嵌套结构 有时最简单的办法就是重新审视应用架构本身是否存在过度复杂的模型关系。尽量简化实体之间的关联程度能够有效降低维护成本以及潜在的技术债务风险。 比如对于那些频繁变更或者难以预测其内部细节的内容来说,考虑采用纯字符串格式(JSON/YAML)来代替传统的 POJO 映射模式不失为一种明智的选择。 --- ### 总结 针对 `java.lang.ClassCastException: LinkedHashMap cannot be cast...` 的问题,主要可以从以下几个方面入手解决: 1. 更改 Redis 默认序列化策略; 2. 手工编写定制化的编解码流程; 3. 调整程序设计方案以适应更灵活的需求场景。 以上任一途径都可以帮助缓解甚至彻底消除此类运行期异常现象的发生概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值