解决 报错 java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to xxx(实体类)

1、前端封装JSON值,后台需要List<实体类>接收

 Map map = jsonObject.getInnerMap();
 List<实体类> list1 = (List<实体类>) map.get("xxx");

2、进行forearch循环的时候报错

xxx.forEach((item)->{})

报错信息:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.xxx.xxxx.entity.xxxx

3、打断点调试查看发现里面封装的是两个Map 而不是实体类
在这里插入图片描述
4、解决方法

 ObjectMapper mapper = new ObjectMapper();
 List<实体类> list1 = (List<实体类>) map.get("xxx");
 List<实体类> xxx= mapper.convertValue(list1, new TypeReference<List<实体类>>() { });

记住引入包路径是下面这两个

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
### 解析 `java.util.LinkedHashMap cannot be cast to TrusteeInfo` 异常 当遇到 `java.util.LinkedHashMap cannot be cast to TrusteeInfo` 这类异常时,表明程序尝试将一个 `LinkedHashMap` 对象强制转换为自定义的 `TrusteeInfo` 类型。这类问题通常发生在使用诸如 `RestTemplate` 或其他 HTTP 客户端库来解析 JSON 数据到 Java 对象的过程中。 #### 原因分析 该异常的根本原因在于反序列化过程中未能正确指定目标对象类型。默认情况下,JSON 反序列化工具(如 Jackson)会创建最接近的数据结构表示——通常是 Map 或 List 形式的集合容器,而不是具体的业务实体类实例[^4]。 #### 正确处理方式 为了防止此类异常的发生,在通过 REST API 获取数据并期望得到特定类型的对象列表时,应该明确告知框架如何映射这些原始数据至预期的目标类型。具体做法如下: 1. 使用泛型参数化的 `ParameterizedTypeReference<T>` 来指明确切的结果集类型; 2. 创建一个新的类用于封装响应消息体中的实际内容字段; 下面是一个改进后的代码片段展示如何实现这一点: ```java // 定义一个包装器类来承载API返回的具体条目 public class ResponseWrapper { private List<TrusteeInfo> content; public List<TrusteeInfo> getContent() { return this.content; } } // 调用外部服务获取数据,并将其直接映射为目标类型 ResponseEntity<ResponseWrapper> response = restTemplate.exchange( url, HttpMethod.GET, null, new ParameterizedTypeReference<ResponseWrapper>() {} ); List<TrusteeInfo> trusteeInfos = Objects.requireNonNull(response.getBody()).getContent(); ``` 上述方法可以确保即使服务器端发送的是标准 JSON 数组格式的数据流,客户端也能顺利地将其解释为一组 `TrusteeInfo` 实例而不会触发非法类型转换错误。 此外,如果只是单个对象而非列表,则可以直接利用 `restTemplate.getForObject()` 方法配合相应的 POJO 类完成同样的操作。 对于已经发生的异常情况,可以通过捕获 `ClassCastException` 并采取适当措施来进行优雅降级或记录日志以便后续排查问题所在。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟小杰子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值