我会写得非常简单,因为实际的修复并不比我不理解的实际设计重要。
似乎一旦我的 @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 将负责路由。
- 如果在同一进程中运行所有内容,则具有签名
method(Body b)
的方法将正确地将信息保留在子类型中。因此(B)b.getList().get{1}
(获取第二个元素,即 B 并将其转换)将是正确的。 - 当将路由切换到本地主机上不同进程上的 stub (Spring Boot)并发送完全相同的数据时,相同的方法签名(
method(@RequestBody Body b
) 会以某种方式忘记信息关于 Body,(B)b.getList().get{1}
将出现强制转换异常。
为什么会发生这种情况? ProducerTemplate 接收相同的数据并将其发送到具有相同签名的方法,这些方法可以访问相同的对象类型。 唯一的区别是,一个与发送请求的客户端在同一进程中运行,而另一个在不同端口的本地主机上运行。
最佳答案
我能够继续前进的唯一方法就是基本上改变 Body
有List<Object>
而不是List<A>
然后探测对象以查看它实际上是什么类型并将其转换为该类型。
因为实际问题是 JSON 被序列化然后反序列化,所以字段本身从 List<A>
发生了变化。至List<HashMap<String,Object>>
关于java - 到达 Controller 时子类型数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57168009/