记一次接口交互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);//GsonString gsonString = new Gson().toJson(bean);System.out.println("Gson: " + gsonString);//fastjsonString fastJsonString = JSON.toJSONString(bean);System.out.println("Fastjson: " + fastJsonString);//JacksonString 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

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

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

相关文章

第39节: Vue3 表单输入绑定及修饰符

在UniApp中使用Vue3框架时&#xff0c;你可以使用表单输入绑定来将用户输入与组件的数据进行绑定。以下是一个示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用表单输入绑定&#xff1a; <template> <view> <input v-model"message" type&qu…

内网离线搭建之----kafka集群

1.系统版本 虚拟机192.168.9.184 虚拟机192.168.9.185 虚拟机192.168.9.186系统 centos7 7.6.1810 2.依赖下载 ps&#xff1a;置顶资源里已经下载好了&#xff0c;直接用&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…

Linux下安装MySQL

Linux下安装MySQL 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html#downloads 解压 tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar 再移动并重命名一下 mv mysql-5.7.26-linux-glibc2.12-x86_64 /usr/local/mysql创建mysql用户组和用户并修改权限…

【回溯】符号三角形问题Python实现

文章目录 [toc]问题描述回溯法时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;回溯法 问题描述 下图是由 14 14 14个“ ”和 14 14 14个“ − - −”组成的符号三角形&#xff0c; 2 2 2个同号下面都是” “&#xff0c; 2 2 2个异号下面都是“ −…

QT编译并部署QtMqtt相关环境+跑测demo【超详细教程】

文章目录 概要整体架构流程▷下载指定版本的QMqtt源码&#xff1a;▷编译后同步MQTT相关文件&#xff1a; 技术名词解释技术实现步骤详解一、编译源码1、编译报错2、解决思路3、编译通过 二、继续完善mqtt应用环境1、打开编译生成的shadow build文件夹2、同步lib3、同步bin4、同…

KafkaLog4jAppender

Apache Log4j 中有一个 Appender 概念&#xff0c;它负责将日志信息输出到各种目的地&#xff0c;例如控制台、文件、数据库等。KafkaLog4jAppender 是 Log4j 的一个扩展&#xff0c;它可以将日志信息发送到 Apache Kafka。 下面是如何在 Log4j 中使用 KafkaLog4jAppender 的一…

【Git-IDEA】在 IDEA 中使用 Git(clone、pull、push、merge、建立本地分支与远程分支的连接)

【Git-IDEA】在 IDEA 中使用 Git&#xff08;clone、pull、push、merge、建立本地分支与远程分支的连接&#xff09; 1&#xff09;Gitee2&#xff09;配置 Git3&#xff09;初始化本地仓库4&#xff09;连接远程仓库5&#xff09;clone5.1.方式一5.2.方式二 6&#xff09;分支…

react常用Hooks

Hooks是可从函数组件“挂钩”到React状态和生命周期功能的函数。 Hooks在class中是无效的——可在没有class的情况下使用React。&#xff08;不推荐重写已有组件&#xff0c;但是如果愿意&#xff0c;可以在一些新的组件中使用 Hooks。&#xff09;React提供一些内置的 Hooks&a…

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

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

鸿蒙系列--组件介绍之其他基础组件(上)

上回介绍了基础组件中最常用的组件常用的基础组件&#xff0c;接下来还有其他基础组件 一、Blank 描述&#xff1a;空白填充组件 功能&#xff1a;在容器主轴方向上&#xff0c;具有自动填充容器空余部分的能力。只有当父组件为Row/Column时生效 子组件&#xff1a;无 Blan…

Spring之提前编译:AOT

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

【Android 13】使用Android Studio调试系统应用之Settings移植(五):ActionButtonsPreference和Utils

文章目录 一、篇头二、系列文章2.1 Android 13 系列文章2.2 Android 9 系列文章2.3 Android 11 系列文章三、剩余子模块的创建四、逐个完成AS移植五、ActionButtonsPreference5.1 依赖分析:ActionButtonsPreference的Android.bp5.2 依赖分析:Utils的Android.bp5.3 Utils编译错…

Linux系统--账号和权限管理

目录 一 用户账号与组账号 ①Linux中每个用户账号是通过 UID来唯一标识的 账户类型UID号描述特点超级管理员0权限受到限制的用户程序用户 1-499 &#xff08;CentOS 6以前&#xff09; 1-999 &#xff08;CentOS 7以后&#xff09; 不登录的用户&#xff0c;系统默认的情况拥…

【Java进阶篇】深拷贝和浅拷贝的理解(保姆级文献)

✔️深拷贝和浅拷贝的理解 在计算机内存中&#xff0c;每个对象都有一个地址&#xff0c;这个地址指向对象在内存中存储的位置。当我们使用变量引用一个对象时&#xff0c;实际上是将该对象的地址赋值给变量。因此&#xff0c;如果我们将一个对象复制到另一个变量中&#xff0c…

一台服务器​最大并发 tcp 连接数多少?65535?

首先&#xff0c;问题中描述的65535个连接指的是客户端连接数的限制。 在tcp应用中&#xff0c;server事先在某个固定端口监听&#xff0c;client主动发起连接&#xff0c;经过三次握手后建立tcp连接。那么对单机&#xff0c;其最大并发tcp连接数是多少呢&#xff1f; 如何标…

Selenium4自动化测试框架

Selenium 介绍 Selenium 是目前用的最广泛的 Web UI 自动化测试框架&#xff0c;核心功能就是可以在多个浏览器上进行自动化测试&#xff0c;支持多种编程语言&#xff0c;目前已经被 google&#xff0c;百度&#xff0c;腾讯等公司广泛使用。 开发步骤 1、配置 google 驱动…

机械革命极光Pro重装Win10系统图解

机械革命极光Pro是性能优秀的笔记本电脑&#xff0c;深受广大用户的喜欢&#xff0c;现在用户想给笔记本电脑重新安装一下操作系统&#xff0c;但不知道重装系统的详细步骤。下面小编将带来机械革命极光Pro笔记本电脑重装系统Win10版本的步骤介绍&#xff0c;帮助更多的用户完成…

Elasticsearch:无需搜索 “Christmas” 即可找到有关圣诞节的书籍

随着假期的临近&#xff0c;我期待着变得舒适&#xff0c;拿起一本新书&#xff0c;享受轻松的时光。 但是使用搜索栏在线发现图书并不像看起来那么容易......大多数零售搜索引擎仅依赖于关键字搜索&#xff0c;当我们确切地知道我们正在寻找什么书名时&#xff0c;这很好&…

Kotlin 类

1、声明 class 关键字声明类 类声明由类名、类头&#xff08;指定其类型参数、主构造函数等&#xff09;以及由花括号包围的类体构成&#xff1b;类头与类体都是可选的&#xff1b; 如果一个类没有类体&#xff0c;可以省略花括号 class Person { /*……*/ }// 没有声明任何…

分布式事务是什么

分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c;特别是在微服务架构中&#xff0c;几乎可以说是无法避免&#xff0c;本文就分布式事务来简单聊一下。 数据库事务 我们先从数据库事务说起。数据库事务可能大家…