RestTemplate 发送的字段第二个大写字母变成小写的问题探究

在使用RestTemplate 发送http 请求的时候,发现nDecisonVar 转换成了ndecisonVar ,但是打印日志用fastjson 打印的没有问题,换成jackson 打印就有问题。因为RestTemplate 默认使用的jackson 作为json 序列化方式,导致的问题,但是为什么出现这个问题呢?

一直搜网上,其实也没有个准确的答案而且很多都是错的,所以我就根据我的理解解读一下。

实体类使用的Lombok @data 进行的getter setter方法生成,发现lombok 和java bean 的规范有差异

JavaBean 的命名规范允许一些特例(如属性名第二个字母大写、前两个字母大写等),但 Lombok 的设计目标是简化代码生成,而非严格遵循所有 JavaBean 特例。其核心逻辑如下:

标准化处理:Lombok 默认将属性名的首字母强制大写,避免因属性名格式不规范导致的歧义。
兼容性优先:许多框架(如 Jackson、Gson)在解析 JSON 时依赖 JavaBean 的命名规范,但 Lombok 的默认行为可能与这些框架的预期不一致,导致字段映射错误。

那大家有没有疑惑

为什么呢?

场景 Jackson 的处理策略有两个
默认 LOWER_CAMEL_CASE 策略 getQWer() → QWer → qWer(首字母小写)。
LOWER_CASE 策略 getQWer() → QWer → qwer(全小写)。
显式使用 @JsonProperty("qWer") 无论策略如何,JSON 键名始终为 qWer。

网上都是说 当jackson 遇到getQWer的时候会触发 LOWER_CASE一样的策略,但是实际上不是的,而是jackson 在处理拆分get set 的逻辑区别
Jackson的处理过程字段 value:方法名 getValue 推断出属性名 value,与字段名一致,成功映射。字段 sName:方法名 setSName 推断出属性名 sname,而 JSON 中的字段是 sName。由于 sname ≠ sName,Jackson无法找到对应的字段或 setter 方法,导致 sName 未被赋值。如果 JSON 请求体中包含 "sName": "John",Jackson会尝试将值映射到 sname 属性。 这个操作就很骚

这个博客说getter的非常详细,大神讲解

https://www.cnblogs.com/xuanyumuxiu/p/17272890.html

解决方案

python 复制代码
@JsonProperty("nDecisonVar")
Integer nDecisonVar;

不行

不对

相关推荐
Zane199414 小时前
调用了 async 函数却没执行?一文讲透协程、event loop 与 await
后端·python
Zane199414 小时前
HashMap 为什么要在长度16、容量必须是2的幂这些细节上较劲
java·后端
长谷深风11114 小时前
为什么你的 Tool 总被模型选错?
java·大数据·ai·llm·ai agent·工具设计·agent设计
掘金者阿豪14 小时前
若依启动突然报 Redis MISCONF?一次从应用报错到磁盘爆满的完整排查记录
后端
paopaokaka_luck15 小时前
基于springboot3+vue3的支教志愿者管理系统(AI问答、协同过滤算法、Echarts图形化分析)
spring boot·echarts
莫得感情 o15 小时前
并发 14 · 收官:虚拟线程与结构化并发
java·并发
boooooooom15 小时前
尝尝咸淡:从朴素 RAG 到 Graph RAG——一个烹饪问答系统的三层检索升级之路
前端·后端·llm
聚美智数15 小时前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库
xierui12312316 小时前
AI Agent 隐私架构:本地化重点为什么是登录态与执行权限
java·人工智能·网络安全·架构
2601_9638701816 小时前
【计算机毕业设计】基于Vue+Spring Boot的助农电商系统的设计与实现
spring boot·后端·课程设计