gpt4 book ai didi

java - 到达 Controller 时子类型数据丢失

转载 作者:行者123 更新时间:2023-12-02 02:42:53 28 4
gpt4 key购买 nike

我会写得非常简单,因为实际的修复并不比我不理解的实际设计重要。似乎一旦我的 @RequestBody 命中 @Controller,有关 subtype 的信息就会丢失。

假设我们有:

class A{
String foo;
}
class B extends A{
String bar;
}

然后另一个类将它们组合在一起 ({A,B,B,A}),将成为请求正文:

class Body{
List<A> list;
}

当从 Camel 发送带有ProducerTemplate的请求时,有两种结果。 Camel 将负责路由。

  1. 如果在同一进程中运行所有内容,则具有签名 method(Body b) 的方法将正确地将信息保留在子类型中。因此 (B)b.getList().get{1} (获取第二个元素,即 B 并将其转换)将是正确的。
  2. 当将路由切换到本地主机上不同进程上的 stub (Spring Boot)并发送完全相同的数据时,相同的方法签名(method(@RequestBody Body b) 会以某种方式忘记信息关于 Body,(B)b.getList().get{1} 将出现强制转换异常。

为什么会发生这种情况? ProducerTemplate 接收相同的数据并将其发送到具有相同签名的方法,这些方法可以访问相同的对象类型。唯一的区别是,一个与发送请求的客户端在同一进程中运行,而另一个在不同端口的本地主机上运行。

最佳答案

我能够继续前进的唯一方法就是基本上改变 BodyList<Object>而不是List<A>然后探测对象以查看它实际上是什么类型并将其转换为该类型。

因为实际问题是 JSON 被序列化然后反序列化,所以字段本身从 List<A> 发生了变化。至List<HashMap<String,Object>>

关于java - 到达 Controller 时子类型数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57168009/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com