Jackson 中没有注释的多态反序列化

2024-05-25

我有一个CloudEvent<T>使用 Jackson(2.9.0 - 最新版本)使用多态反序列化的类,如下所示:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class CloudEvent<T> {

    @NonNull
    private String eventType;

    @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME,
            include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
            property = "eventType",
            defaultImpl = Void.class)
    @JsonSubTypes({
            @JsonSubTypes.Type(value = MyEvent1.class, name = "event-1"),
            @JsonSubTypes.Type(value = MyEvent2.class, name = "event-2")
    })
    private T data;
}

然后反序列化为:

String cloudEventJson1 = "{\"eventType\":\"event-1\",\"data\":{\"id\":\"123\",\"details\":\"detail1\"}}";

CloudEvent deserializedEvent1 = objectMapper.readValue(cloudEventJson1, CloudEvent.class);   //without subtypes

这一切都运行良好。 但由于一些限制,我无法在 CloudEvent 类上使用注释(由外部依赖项提供)。

所以我这样配置 ObjectMapper:

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerSubtypes(new NamedType(MyEvent1.class, "event-1"));
    objectMapper.registerSubtypes(new NamedType(MyEvent2.class, "event-2"));

    TypeResolverBuilder  typeResolverBuilder = new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE)
      .init(JsonTypeInfo.Id.NAME, null)   //CLASS works
      .inclusion(JsonTypeInfo.As.EXTERNAL_PROPERTY)
      .typeProperty("eventType")
      .typeIdVisibility(true)
//    .defaultImpl(Void.class);
    objectMapper.setDefaultTyping(typeResolverBuilder);

但是用与上面相同的方法反序列化不起作用。它正在阅读eventType但它无法与注册的子类型匹配。 我无法在反序列化中使用泛型或 TypeReferance,因为我需要使用spring-integration用于读取仅接受主类的事件;反序列化后手动完成模式匹配。

例外:

com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id 'event-1' as a subtype of [simple type, class java.lang.Object]: known type ids = [] (for POJO property 'data')
 at [Source: (String)"{"eventType":"event-1","data":{"id":"123","details":"detail1"}}"; line: 1, column: 271]

这也是为所有输入类配置 ObjectMapper。这个可以连接吗typeResolverBuilder and subtypes to the CloudEvent.class(就像注释方式一样)。


即使您无法修改您的类,您仍然可以依赖注释。 Jackson 支持一项名为mix-ins:您可以将其视为一种面向方面的方式,在运行时添加更多注释,以增强静态定义的注释。

首先定义一个接口如下:

public interface CloudEventMixIn<T> {

     @JsonTypeInfo(
            use = JsonTypeInfo.Id.NAME,
            include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
            property = "eventType",
            defaultImpl = Void.class)
    @JsonSubTypes({
            @JsonSubTypes.Type(value = MyEvent1.class, name = "event-1"),
            @JsonSubTypes.Type(value = MyEvent2.class, name = "event-2")
    })
    public T getData();
}

然后配置ObjectMapper使用定义的接口作为实际类/接口的混合:

ObjectMapper mapper = new ObjectMapper();
mapper.addMixIn(CloudEvent.class, CloudEventMixIn.class);

来自addMixIn(Class<?> target, Class<?> mixinSource) https://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/ObjectMapper.html#addMixIn-java.lang.Class-java.lang.Class-方法文档:

用于添加混合注释以用于增强指定类或接口的方法。所有注释来自mixinSource被用来覆盖注释target(或其超类型)有。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jackson 中没有注释的多态反序列化 的相关文章

  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • jQuery AJAX 请求在 IE8 中失败,并显示消息“错误:调用 open 方法之前无法调用此方法。”

    我正在使用 jQuery 1 4 2 并尝试执行一个简单的 AJAX 请求 目标 URL 返回一个 JSON 字符串 我使用 jslint 对其进行了验证 该请求在 Firefox 和 Chrome 中有效 但不想在 IE8 中工作 我无法
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 如何格式化 Json 输出

    请帮助我如何获取 JSON 输出 如下所示 costMethod Average fundingDate 2008 10 02 fundingAmount 2510959 95 代替 type sma costMethod Average
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 如何将空字符串序列化为单个空标签?

    我使用 Simple XML 框架序列化此类 Root public class HowToRenderEmptyTag Element required false private String nullString 我想得到
  • Python 柯里化任意数量的变量

    我正在尝试使用柯里化在 Python 中进行简单的函数添加 我找到了这个咖喱装饰器here https gist github com JulienPalard 021f1c7332507d6a494b def curry func def
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • 使用 java 中的准备好的语句插入自定义 SQL 类型

    我有一些自定义类型 它们基本上都是枚举 以下是它们的外观示例 CREATE TYPE card suit AS ENUM spades clubs hearts diamonds 我在 Java 中有一些准备好的语句 看起来像这样 Setu
  • jQuery 自动完成/Twitter Typeahead 填充多个字段

    我目前正在使用 TypeAhead Bootstrap 但很高兴使用 jQuery Autocomplete 来完成我需要的事情 我有 5 个输入字段 我还有一个结构如下的表 因此我将使用远程数据源 Classification Model
  • USB编程

    我想对微控制器 AVR 进行编程 以通过 USB 控制一些 LED 它只是出于对如何构建和编程 USB 设备的兴趣 有一些 AVR 微控制器支持 USB 协议 或者我可以自己在另一个微控制器中实现 USB 协议 但我想知道用什么来在计算机上
  • 自动 Photoshop 从文件插入文本

    我有一个多语言网站 需要自动执行从 csv 源更新 psd 文件中文本图层的过程 我知道由于宽度的变化 psp 中可能会出现故障 但无论如何 将文本放在文档中会有很大帮助 我有什么选择 EDIT Murmelschlurmel 有一个可行的
  • 如何使用startsWith过滤并获取每个对象键的值?

    我试图通过获取每个键来过滤对象checkpoint并输出其值 目前 我只能输出键而不是值 下面 我有一个简单的对象 我正在使用过滤器和startsWith 我怎样才能得到这些值呢 var data practicals 0 checkpoi
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • Django - 如何从中间件修改模板上下文

    我正在创建一个 Django 中间件 它通过会话管理 购物车 我能够成功修改会话数据 如下所示 class ShoppingCartMiddleware def init self get response self get respons
  • 为什么变量不在循环外更新?

    无法弄清楚为什么结果中的第一个键是 abc 而不是我期望的 c 我使用的是Python 3 6 4 数据结构很奇怪 因为我删除了不相关的键和值 f replace ab r data abc 1 def 2 ghi 3 jkf 4 lmn
  • true 和布尔列表 f# 的长度

    直接使用递归 写一个函数truesAndLength bool list gt int int那 返回列表的长度 在该对的第一个组件中 以及列表的数量 列表中正确的元素 在第二个组件中 你的函数必须只迭代 遍历列表的元素一次 请勿使用 Li
  • 如何使 cx-oracle 将查询结果绑定到字典而不是元组?

    这是我的代码 我想找到一种方法将查询结果作为字典列表而不是元组列表返回 看起来 cx oracle 通过部分文档讨论 绑定 来支持这一点 虽然我不知道它是如何工作的 def connect dsn cx Oracle makedsn hos
  • TCP和UDP如何检测传输错误?

    我想知道这些协议如何检测数据传输过程中出现错误 谢谢 可能会发生不同的错误 数据包顺序不正确 数据包丢失 数据包内的数据损坏 幻像数据包 接收方收到从未发送过的数据包 UDP 仅提供一种克服数据损坏的机制 这是 IPv4 中的可选功能 在
  • Cocoa 应用程序未在 High Sierra 上加载视图或运行代码

    我在 Mac AppStore 上有一个应用程序 许多用户最近写信说它无法在 High Sierra 上运行 可能是 10 13 6 很难从中提取具体信息 我设法在朋友的设备上重现了该问题 但是我无法使用该设备通过 Xcode 等进行构建
  • dplyr 中每组的 cumsum

    我开始享受dplyr但我陷入了一个用例 我希望能够申请cumsum数据框中的每个组与包 但我似乎无法正确处理 对于演示数据框 我生成了以下数据 set seed 123 len 10 dates as Date 2014 01 01 1 l
  • Angular Service Worker 路线

    我已经使用 Angular Service Worker 构建了一个应用程序 除了路线之外 它在离线状态下运行良好 如果我转到基本网址 应用程序加载正常 但如果我在离线状态下转到任何其他路线 则会收到离线错误 我的 ngsw manifes
  • Socket.io 最佳编码实践

    我正在开发一个 Node js 应用程序 它使用 Socket io 来处理实时通信 我的代码充满了 On 和 Emit 函数 我也使用房间功能 我的应用程序如下所示 var server require http Server var i
  • RStudio 服务器未启动

    过去几个月我一直在远程 RStudio 服务器上工作 没有任何问题 今天 我使用此命令重新启动了 rstudio 服务器 sudo rstudio server restart 此后 我无法通过浏览器访问服务器 它继续等待 我用这个检查了状
  • Jackson 中没有注释的多态反序列化

    我有一个CloudEvent