记一次接口交互is开头的属性序列化后“is”丢失问题

问题背景:

今天在做项目联调时调用别人的第三方接口时,发现字段传递不对导致参数传递异常的问题,当时还很奇怪,明白传好着呢,怎么就好端端的出现字段不对的情况呢?

查看发现该字段为boolean类型的isIsRefresh,但传给第三方json串里字段变为了isRefresh,发现类中定义的字段确实为isIsRefresh,与设计文档上相同,并非定义错误。因此猜测是在服务传递时导致is丢失。(此处对于这个字段属性名称请大家不要喷,第三方叫这个,非常想改无奈别人的代码没法动,叫的的确不咋样,本文重点说一下为什么会出这个问题,这个问题应该如何解决、处理,请各位大佬不要追究属性名哦,也正是因为这个不规范命名才导致了此次联调失败)。

这个是我传的值:

这个是对方接口接收到的值:(命名凑合看)

这个是我的实体Bean:

明显是有区别的,两个is变成了一个is,导致对方接口参数校验失败,(除了命名之外看着是没有问题的,但就是传值不对)

原因分析:

JavaBean类的属性的类型是boolean类型,那么该属性的读方法的格式可以是isXxx()或者getXxx(),例如,名为state的boolean类型的属性,它的读方法可以是isState()或者是getState()。

【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。

反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

问题验证:

定义一个实体类BeanTest,含有boolean的属性isSuccess 和 String类型的属性name,使用Lombok框架来生成getter、setter和constructor。测试方法分别使用Gson、Fastjson和Jackson来进行序列化,测试结果如下。

@Data
class BeanTest {

    private String name;

    private boolean isSuccess;

    private boolean isFlag;

    public BeanTest(String name, boolean isSuccess, boolean isFlag) {
        this.name = name;
        this.isSuccess = isSuccess;
        this.isFlag = isFlag;
    }

    public BeanTest() {
    }

    public static void main(String[] args) throws JsonProcessingException {
        BeanTest bean = new BeanTest("allen",true,false);

        //Gson
        String gsonString = new Gson().toJson(bean);
        System.out.println("Gson: " + gsonString);

        //fastjson
        String fastJsonString = JSON.toJSONString(bean);
        System.out.println("Fastjson: " + fastJsonString);

        //Jackson
        String jacksonString = new ObjectMapper().writeValueAsString(bean);
        System.out.println("Jackson: " + jacksonString);
    }
}

执行结果:

Gson: {"name":"allen","isSuccess":true,"isFlag":false}
Fastjson: {"flag":false,"name":"allen","success":true}
Jackson: {"name":"allen","success":true,"flag":false}

可以看出使用Gson序列化后的json串没有出现is丢失的问题,而jackson和fastjson均出现了is丢失的问题,Gson是根据类中属性进行序列化,所以结果没什么问题。而Jackson和FastJson的序列化方式是先找到getter方法,再根据JavaBean规范生成对应的属性名,所以不仅isBooTest属性被序列化成booTest且testAtt这个类中根本不存在的属性也在序列化的结果中。

解决方案:

经过测试发现对于jackson和fastjson会出现一下几种情况,而gson在这些情景下都可以正确的序列化 。

1.is开头的非boolean类型字段,使用getIsXXX方法,序列化后字段名不变

2.is开头的非boolean类型字段,使用isXXX方法,序列化之后消失

3.is开头的boolean类型字段,使用getIsXXX方法,序列化之后字段名不变

4.is开头的boolean类型字段,使用isXXX方法,序列化之后字段名前的is被去除

若要避免该问题,有以下几种方法

方法1:bean的boolean属性设置时不要以is作为小驼峰;

方法2:不要使用@Data生成getter,应该使用快捷键生成,然后手动修改成getIsXxx()的形式;

方法3:使用Gson序列化对象;

方法4:bean的布尔类型属性设置为包装类型Boolean,而不要使用boolean。使用Boolean时@Data生成的getter和setter为getIsXxx(), setIsXxx()。

 对于这个问题,我还是要说一句:既然有规范请严格按照规范,起这种命名害人害己,请大家谨记,以下是阿里开发规范,仅供参考!!!!

注释:RPC(Remote Procedure Call,远程过程调用)是一个计算机通信协议。

  • RPC 是一种基于 TCP 传输层或者 HTTP2 应用层的通信协议;
  • HTTP 只基于 HTTP 协议,包括 HTTP1.x(即 HTTP1.0、1.1) 和 HTTP2,目前很多浏览器默认使用 1.x 来访问服务器数据。

当然你要是实在迫不得已没办法了,这么做也是可以改成的,但并不建议! 

 

https://blog.csdn.net/yangf257/article/details/131209619

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

龙蜥开源操作系统能解决CentOS 停服造成的空缺吗?

龙蜥开源操作系统能解决CentOS 停服造成的空缺吗? 本文图片来源于龙蜥,仅做介绍时引用用途,版权归属龙蜥和相关设计人员。 一、《国产服务器操作系统发展报告(2023)》称操作系统已步入 2.0 时代,服务器操作…

【C语言刷题每日一题】一维数组的交换

目录 问题描述 思路分析 代码实现 结果测试 问题描述 将两个整型一维数组的元素进行交换 如果两个数组长度相同就全部交换; 如果两个数组长度不同,则交换长度相同部分的元素 思路分析 为了代码的复用,这里通过函数来实现,…

【QML-对话框】

QML编程指南 VX:hao541022348 弹出类DialogDrawerFileDialog文件对话框 🎳FontDialog字体对话框 🚴ColorDialog 颜色对话框 🏊MessageDialog 消息提示框 🐩 弹出类 Dialog 对话框是一种弹出式对话框,主要…

4.13 构建onnx结构模型-Conv

前言 构建onnx方式通常有两种: 1、通过代码转换成onnx结构,比如pytorch —> onnx 2、通过onnx 自定义结点,图,生成onnx结构 本文主要是简单学习和使用两种不同onnx结构, 下面以 Conv 结点进行分析 方式 方法一…

蓝桥杯的学习规划

c语言基础: Python语言基础 学习路径:画框的要着重学习

补题与总结:leetcode第 377 场周赛

文章目录 写在最前面的复盘2977. 转换字符串的最小成本 II(Flody 爆搜优化->dp) 写在最前面的复盘 感谢leetcode,丰富了我为数不多的卡常经验 2是简单思维题,但卡常 4是爆搜优化,也卡常,补题时给卡麻了…

腾讯NCNN环境部署及pt到ncnn模型转换推理

该内容还未完整,笔记内容,后期补充。 一、模型转换 yolov5s v6.2训练的pt模型,直接导tourchscript,然后时候ncnn里面的pnnx工具直接转换为ncnn 二、部署环境 1.安装vunlkan 1.2.198.1版本,记得配置环境变量 2.安装…

SSH远程登陆服务器

截取自文章:SSH简介及两种远程登录的方法_ssh -CSDN博客 SSH的安装 SSH分为客户端 openssh-client 和服务器 openssh-server,可以利用以下命令确认电脑上是否安装了客户端和服务器。 dpkg -l | grep ssh 如果只是想远程登陆别的机器只需要安装客户端&…

【Web API系列】使用getDisplayMedia来实现录屏功能

文章目录 前言一、认识getD该处使用的url网络请求的数据。二、使用步骤1.使用方法一实现录屏2.使用方法二实现录屏3. 运行效果 延伸 前言 Web API经过长期的发展,尤其是最近,发展相当迅猛,现在已经支持很多功能了,一些原生就支持…

IDEA相关操作

目录 连接MySQL IDEA配置Maven 配置全局Maven 导入Maven项目 方法一 方法二 安装Mybatisx插件 连接MySQL 填写user和Password之后测试连接 如果是第一次连接需要联网下载数据库连接驱动,安装提示下载即可 如果显示如下错误需要更改时区 Server returns …

虚拟机安装windows2012和虚拟机安装国产系统deepin

虚拟机安装windows2012和虚拟机安装国产系统deepin 一.安装windows20121.安装VMWare虚拟机2.1.注意点一:VMWare虚拟网卡2.2.注意点二:配置虚拟网络编辑器3.安装配置Windows Server 2012 R23.1激活windows121.利用下面两个文件进行windows激活2.运行exe文…

5G NR无线蜂窝系统的信道估计器设计

文章目录 DMRS简介DMRS类型DMRS频域密度 信道估计实验仿真实验参数实验实验结论 DMRS简介 DMRS类型 类型A:DMRS位于时隙的第二个或第三个OFDM符号,由14个OFDM符号组成,当数据占据大部分时隙时使用A型映射。 类型B:用在URLLC中&a…

Linux 学习

复制/etc 文件夹到/mnt 目录 cp -r(-a) /etc /mnt回到上一次文件夹 cd -切换到当前用户的家目录_cd ~________________________如何查找ls 命令的位置_______which ls_________________________________请写出ll 命令中查看到的7大文件类型缩写 - s l p c b …

PDF编辑工具--Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款功能强大的PDF编辑和管理软件,它可以帮助用户在创建、编辑、转换和共享PDF文档方面达到前所未有的高度。这款软件提供了丰富的编辑功能,使用户能够轻松添加注释、高亮、下划线、插入文本等,自由地编辑PDF文档。除了…

【MySQL变更】gh-ost原理解读

gh-ost简介 gh-ost是处理MySQL在线表结构变更的工具,与pt-osc 不同,gh-ost不会使用触发器。 gh-ost 可以进行测试,暂停,动态控制和重新配置,审计还有其他许多操作perks。 命名 最初它被命名为gh-osc:Git…

电子电气架构——车载ECU刷写工具vFlash简介

电子电气架构——车载ECU刷写工具vFlash简介 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值&a…

12.26 字符指针

一.基本应用 声明一个字符指针,char *ptr 初始化//在定义指针时,可以将它的初位置定义为空,即char *s NULL char *ptr "Hello"; // 指向字符串字面量的指针 char arr[] "World"; // 字符数组 char *ptr2 arr; // 指向字符数组的指针 访问指针指…

ALS-运动系统解构

角色握持 角色蓝图:将物体绑在手上 动作蓝图: 将握持动画截取一帧(explicit time时间写好) 角色替换 在原人物模型下面加一个骨骼体(先不用添加模型),重命名为bodymesh AI使用流程 新建一…

【OAuth2】:赋予用户控制权的安全通行证--代码模拟篇

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于OAuth2的相关操作吧 上篇已经讲了oauth2的相关知识,详解了oauth2的四种授权模式中的授权码模式,那么这一篇我们就来讲一下授权码模式的…

基于5G智能网关的智慧塔吊监测方案

塔吊是建筑施工中必不可少的设施,由于塔吊工作重心高、起重载荷大、人工视距/视角受限等因素,也使得塔吊在工作过程中着较多的危险因素。对此,可以部署基于工业5G智能网关搭建智慧塔吊安全监测系统,实现对塔吊运行的全局精细监测感…