SpringBoot类属性”第二个字母大写“反序列化问题

1、原因

”在SpringBoot默认序列化的情况下,Web请求的JSON字段包含首字母小写第二个字母大写的变量名无法解析(aName)“。这是由于SpringBoot默认采用Jackson作为序列化工具,Jackson要求遵循javabean的命名规则,第一个单词不能少于两个字符。

2、代码

Jackson的BeanUtil类下的legacyManglePropertyName方法。

protected static String legacyManglePropertyName(final String basename, final int offset) {final int end = basename.length();if (end == offset) { // empty name, nopereturn null;}// next check: is the first character upper case? If not, return as ischar c = basename.charAt(offset);char d = Character.toLowerCase(c);if (c == d) {return basename.substring(offset);}// otherwise, lower case initial chars. Common case first, just one charStringBuilder sb = new StringBuilder(end - offset);sb.append(d);int i = offset+1;for (; i < end; ++i) {c = basename.charAt(i);d = Character.toLowerCase(c);if (c == d) {sb.append(basename, i, end);break;}sb.append(d);}return sb.toString();
}

可以看到最下方的StringBuilder就是最终获取的属性值,sb首先加入d("a",原offset为3时已转换小写),然后把偏移量向后+1。在第一次循环中的c和d分别是“N”和“n”。

这里有一个比较奇怪的判断:如果c == d,则直接拼接后续的字符串,跳出循环;否则,将小写字符拼接后,继续遍历。

第一次遍历后sb的值为“an”。

第二次遍历,由于c == d(“a”==“a”),所以直接拼接后续字符串。

得到sb的最终结果为“aname”。

3、结论

三个解决方案:

  • 使用其他JSON序列化包替换Jackson的MessageConverter。
  • 使用@JsonProperty("aname")注解类属性,指定错误反序列化后的属性名。
  • 遵循JavaBean命名规范

参考文献:

SpringBoot类属性”第二个字母大写“反序列化问题 - 知乎 (zhihu.com)

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

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

相关文章

云服务器如何使用局域网服务器的磁盘空间

说明 云服务器中的磁盘空间不足时&#xff0c;想要开通更多的磁盘空间&#xff0c;但奈何价格太贵&#xff0c;开不起 刚好局域网中有闲置的服务器空间可以拿来用&#xff0c;这里我们直接使用Samba服务来共享文件夹&#xff0c;使用frp来进行内网穿透&#xff1b; 1、磁盘挂…

OSPF优化——OSPF减少LSA更新量2

二、特殊区域——优化非骨干区域的LSA数量 不是骨干区域、不能存在虚链路 1、不能存在 ASBR 1&#xff09;末梢区域 该区域将拒绝 4、5LSA的进人&#xff0c;同时由该区域连接骨干0区域的ABR 向该区域&#xff0c;发布一条3类的缺省路由; 该区域内每台路由器均需配置&#xf…

Unity 实现心电图波形播放(需波形图图片)

实现 在Hierarchy 面板从2D Object 中新建一个Sprite&#xff0c;将波形图图片的赋给Sprite。 修改Sprite 的Sprite Renderer 组件中Draw Mode 为Tiled, 修改Sprite Renderer 的Size 即可实现波形图播放。 在Hierarchy 面板从2D Object 中新建一个Sprite Mask 并赋以遮罩图片…

【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)

&#x1f50d;目的 允许派生组件从与派生类型兼容的基本组件继承某些功能。 &#x1f50d;解释 真实世界例子 对于正在策划赛事的综合格斗推广活动来说&#xff0c;确保在相同重量级的运动员之间组织比赛至关重要。这样可以防止体型明显不同的拳手之间的不匹配&#xff0c;例如…

生成模型 | 从 VAE 到 Diffusion Model (下)

生成模型 | 从 VAE 到 Diffusion Model &#xff08;上&#xff09;的链接请点击下方蓝色字体: 上部分主要介绍了&#xff0c;GAN, AE, VAE, VQ-VAE, DALL-E 生成模型 | 从 VAE 到 Diffusion Model &#xff08;上&#xff09; 文章目录 我们先来看一下生成模型现在的能力一&…

1.2 网络边缘

网络边缘&#xff1a;主机&#xff1b;应用程序&#xff08;客户端和服务器&#xff09; 网络核心&#xff1a;互连着的路由器&#xff1b;网络的网络&#xff08;作用&#xff1a;数据交换&#xff09; 接入网&#xff0c;物理媒介&#xff1a;有线或者无线通信链路 应用进…

IT人的拖延——一放松就停不下来,耽误事?

拖延的表现 在我们的日常工作中&#xff0c;经常会面对这样一种情况&#xff1a;因为要做的Sprint ticket比较复杂或者长时间的集中注意力后&#xff0c;本来打算休息放松一下&#xff0c;刷刷剧&#xff0c;玩玩下游戏&#xff0c;但却一个不小心&#xff0c;没控制住时间&am…

IP 分片过程及偏移量计算

IP 报头中与分片相关的三个字段 1、 标识符&#xff08; ldentifier )&#xff1a;16 bit 该字段与 Flags 和 Fragment Offest 字段联合使用&#xff0c; 对较大的上层数据包进行分段&#xff08; fragment &#xff09; 操作。 路由器将一个包拆分后&#xff0c;所有拆分开的…

图解Java数组的内存分布

我们知道&#xff0c;访问数组元素要通过数组索引&#xff0c;如&#xff1a; arr[0]如果直接访问数组&#xff0c;比如&#xff1a; int[] arr1 {1}; System.out.println(arr1);会发生什么呢&#xff1f; 打印的是一串奇怪的字符串&#xff1a;[I16b98e56。 这个字符串是J…

强化训练:day11(游游的水果大礼包、 买卖股票的最好时机(二)、倒置字符串)

文章目录 前言1. 游游的水果大礼包1.1 题目描述1.2 解题思路1.3 代码实现 2. 买卖股票的最好时机(二)2.1 题目描述2.2 解题思路2.3 代码实现 3. 倒置字符串3.1 题目描述3.2 解题思路3.3 代码实现 总结 前言 1. 游游的水果大礼包   2. 买卖股票的最好时机(二)   3. 倒置字符…

【车道线网络,给予他预训练模型权重,为什么继续训练得不到更好的权重参数,反而会出现检测效果的下降?】】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、检测效果的下降&#xff1f;解决方案总结 车道线网络&#xff0c;给予他预训练模型权重&#xff0c;为什么继续训练得不到更好的权重参数&#xff0c;反而会出现…

NLP(20)--知识图谱

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 基于LLM的垂直领域问答方案&#xff1a; 特点&#xff1a;不是通用语料&#xff1b;准确度要求高&#xff0c;召回率可以低&#xff08;转人工&#xff09;&#xff1b;拓展性和可控性&#xff08;改变特定内容的回答&#xf…

std::mutex

结论&#xff1a; 最终std::mutex 会调用pthread_mutex_t 相关接口 1 std::mutex 定义封装关键数据&#xff1a;typedef __gthread_mutex_t #ifdef _GLIBCXX_HAS_GTHREADS// Common base class for std::mutex and std::timed_mutexclass __mutex_base{protected:typedef __g…

数据结构初阶 栈

一. 栈的基本介绍 1. 基本概念 栈是一种线性表 是一种特殊的数据结构 栈顶&#xff1a;进行数据插入和删除操作的一端 另一端叫做栈底 压栈&#xff1a;插入数据叫做压栈 压栈的数据在栈顶 出栈&#xff1a; 栈的删除操作叫做出栈 出栈操作也是在栈顶 栈遵循一个原则 叫做…

Python深度学习:【模型系列】一文搞懂Transformer架构的三种注意力机制

文章目录 1. 什么是注意力机制?2. Transformer 的注意力层2.1 注意力机制基础2.2 理解Q,K,V2.3 交叉注意力层2.4 全局自注意力层2.5 因果注意力层3. 位置编码4. 多头注意力机制5. 总结1. 什么是注意力机制? 注意力机制最初受到人类视觉注意力的启发,目的是让模型在处理大…

JavaEE:Servlet创建和使用及生命周期介绍

目录 ▐ Servlet概述 ▐ Servlet的创建和使用 ▐ Servlet中方法介绍 ▐ Servlet的生命周期 ▐ Servlet概述 • Servlet是Server Applet的简称&#xff0c;意思是 用Java编写的服务器端的程序&#xff0c;Servlet被部署在服务器中&#xff0c;而服务器负责管理并调用Servle…

2024.5.21 作业 xyt

今日课堂内容&#xff1a;域套接字 TCP流式套接字 //服务器 #include <myhead.h> int main(int argc, const char *argv[]) {//1、为通信创建一个端点int sfd socket(AF_UNIX, SOCK_STREAM, 0);//参数1&#xff1a;说明使用的是ipv4通信域//参数2&#xff1a;说明使用…

ffpmeg之avformat_network_init和avdevice_register_all函数

avformat_network_init 如果利用ffpmeg库拉取视频流或者通过http协议打开视频文件播放&#xff0c;涉及到网络IO操作的&#xff0c;在应用程序之前首先需要调用avformat_network_init函数&#xff0c;该函数调用后就实现了对ffmpeg模块IO的一些初始化&#xff0c;后续就可以利…

HTML静态网页成品作业(HTML+CSS)——动漫海绵宝宝介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…