java - 到达控制器时子类型数据丢失
问题描述
我将把它写得非常简单,因为实际修复不如我不理解的实际设计位重要。似乎一旦我的@RequestBody击中@Controller,有关的信息subtype
就会丢失。
假设我们有:
class A{
String foo;
}
class B extends A{
String bar;
}
然后另一个类将它们 ( {A,B,B,A}
) 组合成一个请求体:
class Body{
List<A> list;
}
当使用ProducerTemplate从骆驼发送请求时,有两种结果。Camel 将负责路由。
- 如果在同一进程中运行所有内容,带有签名的方法
method(Body b)
将正确地将信息保留在子类型中。所以 a(B)b.getList().get{1}
(获取第二个元素,这是一个 B 并转换它)将是正确的。 - 当将路由切换到 localhost 上不同进程上的
method(@RequestBody Body b
存根(Spring Boot)并发送完全相同的数据时,相同的方法签名((B)b.getList().get{1}
为什么会这样?ProducerTemplate接收相同的数据并将其发送到具有相同签名的方法,这些方法可以访问相同的对象类型。唯一的区别是,一个与发送请求的客户端在同一个进程中运行,而另一个在不同端口的 localhost 上运行。
解决方案
我能够继续前进的唯一方法是基本上改变Body
to haveList<Object>
而不是List<A>
然后探测 Object 以查看它实际上是什么类型并将其转换为那个类型。
因为实际的问题是 JSON 被序列化然后反序列化,所以字段本身是从更改List<A>
为List<HashMap<String,Object>>
推荐阅读
- pandas - 如何在数据框中插入新列并使用 for 循环根据某些条件将值传递给它
- flutter - 颤动的应用程序可以在未运行时在接收推送通知时运行代码吗
- azure - 如何在没有任何授权令牌的情况下使用 Azure API for FHIR Server
- sql - Oracle 数据库中的 ASCII 字符问题
- angular - 如何使用现有行将另一个患者添加到表单中?
- javascript - Vue Atlas中如何以表格形式显示数据
- javascript - 生产环境中 React Native 中的全局未处理承诺拒绝处理程序
- python - 在python中的numpy数组中查找具有条件的第一个元素的索引
- android - 我不能使用 com.google.android.material.button.MaterialButton 使用材质按钮
- swift - SwiftUI 列表禁用单元格按下