首页 > 解决方案 > 到达控制器时子类型数据丢失

问题描述

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

假设我们有:

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

然后另一个类将它们 ( {A,B,B,A}) 组合成一个请求体:

class Body{
    List<A> list;
}

当使用ProducerTemplate从骆驼发送请求时,有两种结果。Camel 将负责路由。

  1. 如果在同一进程中运行所有内容,带有签名的方法method(Body b)将正确地将信息保留在子类型中。所以 a (B)b.getList().get{1}(获取第二个元素,这是一个 B 并转换它)将是正确的。
  2. 当将路由切换到 localhost 上不同进程上的method(@RequestBody Body b存根(Spring Boot)并发送完全相同的数据时,相同的方法签名((B)b.getList().get{1}

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

标签: javaspringspring-bootapache-camel

解决方案


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

因为实际的问题是 JSON 被序列化然后反序列化,所以字段本身是从更改List<A>List<HashMap<String,Object>>


推荐阅读