【发布时间】:2019-08-02 18:42:19
【问题描述】:
我会把这个写得非常简单,因为实际的修复不如我不理解的实际设计位重要。
似乎一旦我的 @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)的方法将正确地保留子类型中的信息。因此,(B)b.getList().get{1}(获取第二个元素,即 B 并将其转换)将是正确的。 - 当将路由切换到 localhost 上不同进程上的存根 (Spring Boot) 并发送完全相同的数据时,相同的方法签名 (
method(@RequestBody Body b) 会以某种方式忘记有关 Body 的信息,以至于(B)b.getList().get{1}将获得强制转换异常。
为什么会这样? ProducerTemplate 接收相同的数据并将其发送到具有相同签名的方法,这些方法可以访问相同的对象类型。 唯一的区别是,一个运行在与发送请求的客户端相同的进程中,而另一个运行在不同端口的 localhost 上。
【问题讨论】:
标签: java spring spring-boot apache-camel