【问题标题】:Subtype data is lost when reaching controller到达控制器时子类型数据丢失
【发布时间】:2019-08-02 18:42:19
【问题描述】:

我会把这个写得非常简单,因为实际的修复不如我不理解的实际设计位重要。 似乎一旦我的 @RequestBody 命中 @Controllersubtype 上的信息就会丢失。

假设我们有:

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) 的方法将正确地保留子类型中的信息。因此,(B)b.getList().get{1}(获取第二个元素,即 B 并将其转换)将是正确的。
  2. 当将路由切换到 localhost 上不同进程上的存根 (Spring Boot) 并发送完全相同的数据时,相同的方法签名 (method(@RequestBody Body b) 会以某种方式忘记有关 Body 的信息,以至于 (B)b.getList().get{1}将获得强制转换异常。

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

【问题讨论】:

    标签: java spring spring-boot apache-camel


    【解决方案1】:

    我能够继续前进的唯一方法是基本上将Body 更改为List&lt;Object&gt; 而不是List&lt;A&gt;,然后探测对象以查看它实际上是什么类型并将其转换为那个类型。

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

    【讨论】:

      猜你喜欢
      • 2014-09-13
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 2012-11-15
      • 2019-04-24
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多