当前位置: 首页 > news >正文

Jackson:String转object反序列化失败

场景

消费mq时String转Object

代码

for (MessageExt msg : msgs) {String msgBody = new String(msg.getBody(), StandardCharsets.UTF_8);BinlogEvent binlogEvent = JsonUtil.silentString2Object(msgBody, BinlogEvent.class);binlogEvent.setPort(Long.valueOf(port));tConsumer.consume(binlogEvent);}

binlogEvent.setPort空指针,说明binlogEvent为空

debug报错信息

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)at [Source: (String)"{ "before": {}, "after": { "id": 1019, "name": "ababababab", "score": 99 }, "source": { "version": "zzcdc:", "connector": "mysql", "name": "zzcdc:task:5017", "ts_ms": 1686193967, "db": "cdc", "table": "t1", "server_id": 192215017, "gtid": "", "file": "", "pos": 0, "row": 0, "partition_key": "5017:cdc:t1:1019" }, "op": "u", "ts_ms": 1686193967808, "transaction": null, "timestamp": "2023-06-08T11:12:47.808178366+08:00", "ts_u_ms": 1686193967808178}"; line: 1, column: 13] (through reference chain: com.zhuanzhuan.datasync.helper.mq.event.BinlogEvent["before"])

原因分析

Cannot deserialize value of type `java.lang.String` from Object value (token `JsonToken.START_OBJECT`)

报错信息:意思是Object反序列化为String失败

String:

{"before": {},"after": {"id": 1019,"name": "ababababab","score": 99},"source": {"version": "zzcdc:","connector": "mysql","name": "zzcdc:task:5017","ts_ms": 1686193967,"db": "cdc","table": "t1","server_id": 192215017,"gtid": "","file": "","pos": 0,"row": 0,"partition_key": "5017:cdc:t1:1019"},"op": "u","ts_ms": 1686193967808,"transaction": null,"timestamp": "2023-06-08T11:12:47.808178366+08:00","ts_u_ms": 1686193967808178
}

承接实体Object:

public class BinlogEvent {private String before;private String after;private String source;private String op;private Long tsMs;private String transaction;private String timestamp;private Long tsUMs;
}

发现原因:JSON/Object数据不能用String承接

解决

方法1:使用Object承接

public class BinlogEvent {private Object before;private Object after;private Object sourceprivate String op;private Long tsMs;private Object transaction;private String timestamp;private Long tsUMs;
}

方法2:新建JSON对应实体类承接

 public class BinlogEvent {private Object before;private Object after;private BinlogSourceEvent sourceprivate String op;private Long tsMs;private Object transaction;private String timestamp;private Long tsUMs;
}public class BinlogSourceEvent {private String version;private String connector;private String name;private Long tsMs;private String db;private String table;private Long serverId;private String gtid;private String file;private Long pos;private Long row;private String partitionKey;
}
http://www.lryc.cn/news/105721.html

相关文章:

  • Spark_Core---6
  • 游戏运营需要什么条件和准备?
  • SVN限制Message提交的格式
  • windows下安装anaconda、pycharm、cuda、cudnn、PyTorch-GPU版本
  • 【计算机网络】传输层协议 -- UDP协议
  • python制作超高难度走迷宫游戏,你要来挑战嘛~(赶紧收藏)
  • springboot整合tio-websocket方案实现简易聊天
  • 《TCP IP网络编程》第十三章
  • 驱动开发 day8 (设备树驱动,按键中断实现led亮灭)
  • DataX将MySQL数据同步到HDFS中时,空值不处理可以吗
  • P3373 【模板】线段树 2(乘法与加法)(内附封面)
  • 实现langchain-ChatGLM API调用客户端(及未解决的问题)
  • 【AltWalker】模型驱动:轻松实现自动化测试用例的生成和组织执行
  • 大数据课程E3——Flume的Sink
  • 如何快速做单元测试?
  • 不同对象的集合转换
  • 【机器学习】Gradient Descent
  • 直播读弹幕机器人:直播弹幕采集+文字转语音(附完整代码)
  • K3s vs K8s:轻量级对决 - 探索替代方案
  • dev控件gridControl,gridview中添加合计
  • SpringBoot基础认识
  • 二十三种设计模式第十九篇--命令模式
  • STM32基础入门学习笔记:基础知识和理论 开发环境建立
  • Qt应用开发(基础篇)——数值微调输入框QAbstractSpinBox、QSpinBox、QDoubleSpinBox
  • html | 无js二级菜单
  • appium的基本使用
  • Dockerfile构建nginx镜像(编译安装)
  • 手机屏幕视窗机器视觉定位软硬件-康耐德
  • Databend 开源周报第 104 期
  • 用于医学图像分类的双引导的扩散网络