class java.util.LinkedHashMap cannot be cast to xxx

发布时间:2026/10/17 10:30:15

class java.util.LinkedHashMap cannot be cast to xxx 错误复现这个报错是在学习微服务的过程中发现的涉及到 Feign 远程调用。一共有两个服务user 和 user2。user 的 Feign 接口如下FeignClient(user) public interface UserClient { GetMapping(/user/getUser) Result getUser(RequestParam(id) int id); }接口实现如下GetMapping(/user/getUser) Override public Result getUser(int id) { return Result.success(new User(李华, 18)); }Result 是通用的返回类NoArgsConstructor AllArgsConstructor Data public class Result { private int status; private String msg; private Object data; public static Result success(Object data) { return new Result(1, null, data); } public static Result success() { return new Result(1, null, null); } }然后在 user2 服务中调用了 user 的 Feign 接口GetMapping(/user2/getUser) public Result getUser(int id) { Result result userClient.getUser(id); Object data result.getData(); User user (User) data; return Result.success(user); }结果就报错了在 User user (User) data 这里的强制类型转换错误了。这里我就不懂了Result.success(new User(李华, 18))Object data new User(李华, 18)从接口调用方得到的 data 也是 Oject 类型啊Object data result.getData()。不应该是 Object data new User(李华, 18)然后 User user (User) data这不是标准的向上转型和向下转型吗为什么这个时候把 Object 转成 User 就报错了呢原因分析问过 AI 才知道因为这个对象跨服务了。这个 User 对象从一个服务传输到了另一个服务那这个 User 对象是怎么传输过去的呢加了 RestController 注解User 对象就是被转成 JSON 字符串传输过去的然后被接口调用方从 JSON 解析得到 Result 对象。关键就在这里User 对象被转成了 JSON 字符串JSON 会记录这个 User 对象的类型吗并不会吧所以 JSON 被解析后再转成 User 对象就报错了。不对吧如果 JSON 不知道这个 User 对象的类型是怎么获取 User 的属性呢{status: 1, msg: null, data: {name: 李华, age: 18}}data 是 Object 类型啊如果不知道 data 是 User 类型怎么知道有 name 和 age 呢在 java 对象 - JSON 字符串的时候因为 data new User(李华, 18)框架中的 JSON 解析器可以通过反射获取 data 指向的 User 对象的属性所以这个接口返回的 JSON 字符串是包含 User 对象的 name 和 age 的。当这个 JSON 对象来到接口调用方的时候因为在 UserClient 中已经确定了 getUser 这个接口返回的就是 Result 对象所以 JSON 解析器会将 {status: 1, msg: null, data: {name: 李华, age: 18}} 这个字符串转成 Result 对象。这个 JSON 没有把 User 写在额头上吧所以 JSON 解析器会把 {name: 李华, age: 18} 转成 Object而不是转成 User 对象。但是呢JSON 解析器也不清楚 {name: 李华, age: 18} 到底是什么对象但是 JSON 都是键值对所以 JSON 解析器把 {name: 李华, age: 18} 转成了 LinkedHashMapString, Object 的对象也就是 Object data new LinkedHashMapString, Object()。User user (User) data 就是把 LinkedHashMap 对象转成 User 对象所以报错了提示class java.util.LinkedHashMap cannot be cast to class org.example.model.User。解决方案既然现在知道 data 是一个 LinkedHashMap 对象就可以解决问题了。方案一用 LinkedHashMap 的 API 获取 User 属性。GetMapping(/user2/getUser) public Result getUser(int id) { Result result userClient.getUser(id); Object data result.getData(); LinkedHashMapString, Object map (LinkedHashMapString, Object) data; User user new User(); String name (String) map.get(name); Integer age (Integer) map.get(age); user.setName(name); user.setAge(age); return Result.success(user); }方案二用 JSON 解析器转成 User 对象GetMapping(/user2/getUser) public Result getUser(int id) { Result result userClient.getUser(id); Object data result.getData(); ObjectMapper objectMapper new ObjectMapper(); User user objectMapper.convertValue(data, User.class); return Result.success(user); }泛型尝试原来这个报错是因为 JSON 转对象的时候不知道类型啊那我把 Result 的 data 改成泛型不就行了吗好吧进行一下泛型的尝试NoArgsConstructor AllArgsConstructor Data public class ResultT { private int status; private String msg; private T data; public static T ResultT success(T data) { return new Result(1, null, data); } public static Result success() { return new Result(1, null, null); } }如果只改 Result 的话还是会报错的因为你没改接口。接口返回的还是 Result没有指定返回值的类型。java 是有泛型擦除的所以接口调用方还是会把 JSON 字符串转成 Result 对象把 data 字符串转成 LinkedHashMap令 data LinkedHashMap 对象强转还是报错。需要手动指定返回值的类型才可以自动转换GetMapping(/user/getUser) ResultUser getUser(RequestParam(id) int id);GetMapping(/user2/getUser) public ResultUser getUser(int id) { ResultUser result userClient.getUser(id); User user result.getData(); return Result.success(user); }现在直接获取到的就是 User 对象了JSON 解析器在底层已经帮你完成转换流程了。泛型不是会被擦除吗怎么这里又知道是 User 类型了泛型确实会被擦除啊但是接口方法都写明了返回的是一个 User 类对象ResultUser result userClient.getUser(id)JSON 解析器就知道了要把 data 转成 User 对象。那我如果不需要在 Result 对象中设置 data 呢那就让 data 等于 null 就可以了。public static T ResultT success() { return new Result(1, null, null); }Controller 层的接口返回 ResultVoid 表示这个接口没有 dataJSON 字符串中 data 为 null。GetMapping(/void-test) public ResultVoid voidTest() { return Result.success(); }{ status: 1, msg: null, data: null }
延伸阅读

更多相关文章

2026/10/17 10:25:15

YOLOv8工业落地避坑指南:从数据清洗到TensorRT部署

简介:本资源是一套基于YOLOv8的图像识别完整实践项目,面向计算机视觉初学者与Python深度学习开发者,聚焦目标检测任务的端到端实现,适用于安全监控、工业质检、智能相册等典型应用场景。压缩包共53个文件,含10个核心Py…

2026/10/17 10:25:15

AUTOSAR C/S端口通信机制与LED控制实验深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 11:40:19

从AI生成到手工质感:ArtCraft创作工作流全解析

做艺术创作的人应该都有一个共同体验:用AI出图,速度是真的快,但“机器味”也是真的重。你让模型画一个陶艺工作室,它给你产出构图完美、光影正确、细节几乎没有瑕疵的图,可放大看,总觉得少了点人味&#xf…

2026/10/17 11:40:19

TensorFlow实战:从零搭建AlexNet进行猫狗图像分类

猫狗分类(Dogs vs Cats)这个项目,几乎每个深度学习入门的人都会撞上。数据量适中、类别清晰、不需要标框也不需要搞分割,拿它当第一个完整的图像分类实战再合适不过。但说实话,如果你只是图省事,直接调一个…

2026/10/17 11:40:19

AI辅助写专著全流程:工作流、工具组合与实操避坑指南

写一本专著,过去常被看作以年为单位的大工程。现在如果把一套AI工具链跑熟,从构思、目录、初稿到审校完稿,整体时间能压到过去的三分之一甚至更少。这个判断不是我拍脑袋想出来的,在过去一年多时间里,我完整用AI走通过…

2026/10/17 11:40:19

从零实现一个网页图编辑器:数据模型、Canvas渲染与交互设计

最近接了个新需求,项目代号就叫 diagram-design。名字看着挺泛,实际上是要在网页里做一个通用的图表设计器:用户能拖拖拽拽,把不同的节点放到画布上,连上线,导出一张能用的架构图、流程图或者知识图谱。别小…

2026/10/17 11:40:19

8位量化如何缓解大模型灾难性遗忘:少即是多

8 位量化,在大模型圈子里通常被归进"压缩部署"那一类——32 位浮点权重压成 8 位整数,换来更小的显存占用和更快的推理速度,训练时谁没事会主动去量化自己。但最近读到这篇关于持续学习(Continual Learning)…

2026/10/17 11:35:19

STM32F10x标准库3.6.0环境搭建与避坑指南

简介:STM32F10x标准库3.6.0最终版是ST官方为STM32F10X系列推出的标准外设库,面向使用STM32芯片进行嵌入式开发的工程师、高校学生及电子爱好者。它把底层寄存器操作封装成库函数,开发者无需逐位配置寄存器,直接调用即可完成GPIO、…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑