自定义jackson序列化_Jackson中的自定义反序列化程序和验证

自定义jackson序列化

tl; dr:将输入验证添加到Jackson中的自定义json解串器中很重要。

在RHQ中,我们在几个地方使用了Json解析-直接在as7 / Wildfly插件中,或者通过RESTEasy 2.3.5间接在REST-api中使用,已经很繁重了。

现在,我们有一个bean Link ,看起来像:

public class Link {String rel;String href;
}

序列化的标准方法是

{ "rel":"edit", "href":"http://acme.org" }

由于我们需要其他格式,因此我编写了一个自定义序列化程序并将其附加在类上。

@JsonSerialize(using = LinkSerializer.class)
@JsonDeserialize(using = LinkDeserializer.class)
@Produces({"application/json","application/xml"})
public class Link {private String rel;private String href;

此自定义格式如下:

{"edit": {"href": "http://acme.org"}
}

由于客户端也可以发送链接,因此需要进行一些自定义反序列化。 解串器的第一个片段看起来像这样,效果很好:

public class LinkDeserializer extends JsonDeserializer>{@Overridepublic Link deserialize(JsonParser jp,DeserializationContext ctxt) throws IOException{String tmp = jp.getText(); // {jp.nextToken(); // skip over { to the relString rel = jp.getText();jp.nextToken(); // skip over  {[…]Link link = new Link(rel,href);return link;}

现在,几天前发生的事情是,在某些测试中,我正在发送数据,而我们的服务器严重崩溃。 内存使用量增加,垃圾回收器花费了大量cpu时间,并且该调用最终因OutOfMemoryException终止。

经过一番调查,我发现客户端没有以我们的特殊格式发送Link对象,而是以我最初显示的原始格式发送了。 进一步的研究表明,实际上, LinkDeserializer正在消耗流中的令牌,如上所示,然后还吞没了输入中的后续令牌。 因此,当它返回时,整个解析器的状态很差,然后尝试复制大数组,直到我们看到OOME。

得到这个之后,我更改了实现以添加验证并在无效输入时尽早提供援助,以使解析器在无效输入时不会陷入不良状态:

public Link deserialize(JsonParser jp,DeserializationContext ctxt) throws IOException{String tmp = jp.getText(); // {validate(jp, tmp,"{");jp.nextToken(); // skip over { to the relString rel = jp.getText();validateText(jp, rel);jp.nextToken(); // skip over  {tmp = jp.getText();validate(jp, tmp,"{");[…]

然后,那些validate*()简单地将令牌与传递的期望值进行比较,并对意外输入抛出Exception:

private void validate(JsonParser jsonParser, String input,String expected) throws JsonProcessingException {if (!input.equals(expected)) {throw new JsonParseException("Unexpected token: " + input,jsonParser.getTokenLocation());}}

验证也许可以进一步改善,但是您可以理解。

参考: Jackson中的Custom Deserializer,以及 JCG合作伙伴 Heiko Rupp在“ 一些要记住的博客”上的验证。

翻译自: https://www.javacodegeeks.com/2013/08/custom-deserializer-in-jackson-and-validation.html

自定义jackson序列化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347060.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于西门子PLC s7-200 的自动立体车库设计自动化设计(控制器步进电机直流电机)

本组的设计题目是《基于 PLC 的立体车库设计》,本组设计包括机械设计,电路设计以及程序设计。在设计中遇到了很多困难,参考了相关资料,与老师进行多次沟通,一边学习一边制作,以厂家资料为标准进行修改&…

在Java 8之前,您编写了几行代码来对对象集合进行排序?

在Java 8之前,您编写了几行代码来对对象集合进行排序? Java 8您需要多少个? 您可以在Java 8中用一行完成。 让我们看看下面的Employee类。 public class Employee {private String name;private Integer age;public Employee(String name,…

MFC无边框对话框实现拖动

解决无标题栏窗口的拖动问题有两种方案,一种方案是使用常规思路来处理鼠标拖拽事件,当窗口获得WM_LBUTTONDOWN(OnLButtonDown)时,通过设置标志并调用CWnd::SetCapture()函数来让当前窗口捕捉鼠标…

基于51单片机的8八路抢答器设计

基于51单片机的8路抢答器 具体功能: (1)主持人进行复位,依次显示8位选手的分数,8位选手分数显示结束后主持人方可按下开始按键; (2)主持人按下抢答开始按键,抢答者才可以…

基于51单片机的简易抢答器设计

基于51单片机的简易抢答器 具体功能: 1、主持人按下抢答开始按键,抢答者才可以开始抢答,数码管抢答倒计时20S。 2、抢答者按下按键,数码管显示抢答者的编号。 3、可以通过按键修改倒计时时间。 部分程序代码: #incl…

Word2019中Visio对象图片插入题注时自动删除标签与编号前的空格,编号后添加空格

问题引入 撰写论文时为了修改方便,通常以插入题注和交叉引用的方式来给图片标号,这样修改图片和图号后可以方便、自动地更新。 然而,Word在插入题注上从03到13一直没有针对中国用户优化。 插入题注的标签与编号间有一个空格,当…

【32位win7一键扫雷】32位win7系统自带扫雷游戏逆向分析之一键扫雷(附VS代码工程文件、可执行文件和OD分析缓存文件)

实现效果 视频地址:https://www.zhihu.com/zvideo/1373742900744974336 附一张扫雷自定义中难度最大时进行一键扫雷的截图,如下,24*30,共668颗雷。 前言 一直对逆向感兴趣,就拿最简单的扫雷开始,对于XP系统中的扫雷,雷的数目以及雷区的地址都是固定的,可以直接通过…

基于51单片机的智能电子秤设计课程设计毕业设计

微信公众号:创享日记 对话框发送:单片机电子秤 获取仿原理图、真源文件、源程序代码和论文报告等 由STC89C51单片机最小系统LCD1602液晶显示模块HX711AD模块LED模块蜂鸣器按键模块10kg压力传感器构成。 具体功能: 1、数码管显示当前的重量&a…

java文件序列化_通过快速Java和文件序列化加快速度

java文件序列化从Java的第一个版本开始&#xff0c;许多开发人员每天都在努力实现至少与C / C 一样好的性能。 JVM供应商正在通过实现一些新的JIT算法来尽力而为&#xff0c;但仍有许多工作要做&#xff0c;尤其是在我们如何使用Java方面。 例如&#xff0c;对象<->文件…

【黑客帝国数字雨屏保】基于Win32的黑客帝国数字雨屏幕保护程序(附VS工程代码文件和可执行文件)

运行效果 代码结构 //黑客帝国数字雨 花心胡萝卜 #包含 <windows.h> #包含 <stdlib.h>#define 时钟编号 1 #define 最大长度 25 //一个显示列的最大长度 #define 最小长度 8 //一个显示列的最小长度 // 类型定义 结构类型 _字符序列 {//整个当作屏幕的一个显示列…

TestContainers和Spring Boot

TestContainers太棒了&#xff01; 它提供了一种非常方便的方式来启动和清除JUnit测试中的Docker容器。 此功能对于将应用程序与实际数据库以及可使用docker映像的任何其他资源进行集成测试非常有用。 我的目标是演示使用TestContainers对基于JPA的Spring Boot Application进行…

【模式识别】信号检测实验及MATLAB仿真

一、 参数 高斯噪声均值 u = 0 u = 0 u=0,方差 σ = 1 \sigma =

【模式识别】Fisher线性判别实验报告之MATLAB仿真

一、 参数 1.题设三个类,每个类均有10个样本,分别为w1,w2,w3,因此采用两两互相分类,最后得出结果; 2.三类样本的均值向量依次为m1,m2,m3; 3.三类样本的类内离散度矩阵依次为S1,S2,S3; 4.对于w1和w2,总类内离散度矩阵为Sw12,类间离散度矩阵为Sb12,通过矩阵特…

不知所措:您是否真的需要为您的API提供客户端库?

RESTful Web服务和API的优点在于&#xff0c;任何使用HTTP协议的使用者都可以理解和使用它。 但是&#xff0c;同样的难题一遍又一遍地弹出&#xff1a;您是否应该将Web APis与客户端库一起使用&#xff1f; 如果是&#xff0c;您应该支持哪些语言或/和框架&#xff1f; 通常这…

【模式识别】K均值聚类算法应用实验报告及MATLAB仿真

一、 实验目的 1.掌握K均值聚类算法的原理和实现过程; 2.掌握K均值聚类算法的应用方法。 二、 实验内容 1.彩色图像分割 选择一幅图像,分别按三种颜色数进行彩色图像分割的结果(原图和分割图)。步骤如下: (1) 第一步:读入一幅rgb图像并显示; (2) 第二步:将该幅图…

【模式识别】特征评价和可分性判据实验报告及MATLAB仿真

一、 实验目的 1.掌握几种常用的特征评价方法和可分性判据; 2.解图像阈值分割中几种确定阈值的方法。 二、 实验原理 假设图像中出现的最大灰度级为m,阈值为g,目标部分灰度均值为mean1,像素数占整个图像比例为w1;背景部分灰度均值为mean2,像素数占整个图像比例为w2。…

web应用插件开发_Web应用程序的简单插件系统

web应用插件开发我们需要制作多个具有很多共享功能的基于Web的项目。 为此&#xff0c;某种插件系统将是一个不错的选择&#xff08;作为粘贴粘贴内容的替代方法&#xff09;。 有些框架&#xff08;例如grails&#xff09;可以选择制作Web插件&#xff0c;但大多数没有&#x…

【自适应盲均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真

关注公号【逆向通信猿】更精彩!!! 关于均衡的基础知识,首先可参考本人博客 LMMSE、Godard、CMA常模、Sato等算法在信道均衡中的应用理论与MATLAB仿真 理论推导 代价函数 J = E [ e G o d a r d p

【自适应盲均衡3】多模算法(MMA)——复数改进常模算法(MCMA)的理论推导与MATLAB仿真

关注公号【逆向通信猿】更精彩!!! 接上篇【自适应均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 理论推导 MMA或者MCMA其实是在CMA基础上改进而得到的,有学者称其为实虚部分开的常模算法。该算法使均衡器输出信号的实部与虚部分别收敛于各自的模值,改…

程序猿必备工具『CSDN浏览器助手』之超实用小工具测评

CSDN浏览器助手简介 CSDN浏览器助手由CSDN官方开发&#xff0c;集成【一键呼出搜索】、【万能快捷工具】、【个性标签页】和【 “真”免广告】四大功能&#xff0c;打开后给人的第一印象就是 清新脱俗 四个字&#xff0c;功能非常丰富&#xff0c;快捷键的使用能够大大提高工作…