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

标签 java spring spring-boot apache-camel

我会写得非常简单,因为实际的修复并不比我不理解的实际设计重要。 似乎一旦我的 @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/

相关文章:

security - Spring Boot - 仅保护执行器端点

java - Spring bean 注入(inject)无法正常工作

java - Jackson JSON - 反序列化时从日历对象中剥离时区

java - 从 html 文件中获取信息

java - 缺少 [java.lang.String] 类型的 header 'Authorization'

java - 当一对多关系的火合并时,Hibernate 抛出 EntityNotFoundException

java - 如何将多个对象从 Angular2 发送到 Java Spring 后端

spring - Primefaces 文件上传仅适用于要上传的第一个文件

java - JDBC API 用于修剪字符串长度以匹配数据库列规范

java - 为什么这个复合主键被视为唯一,我该如何修复它?