本文记录一次在 Spring Boot 项目中,DTO 字段明明有值,反序列化后却是 null 的问题。最终发现并不是常见的 JSON 工具库 Bug,而是隐藏在 setter 命名大小写规则中的坑。


💻 背景介绍

技术栈如下:

  • Spring Boot:2.2.3.RELEASE

  • Java:1.8

  • JSON 序列化:默认使用 Jackson,部分地方使用 Fastjson

  • 使用了 Lombok@Data 注解简化 DTO 编写

业务中,前端提交如下 JSON 数据:

{"cPlanId": "CP-202507150001"
}

DTO 如下:

@Data
public class CPlanIdRequestDTO implements Serializable {@NotBlank(message = "不能为空")private String cPlanId;
}

🧪 问题表现

后端接收到的参数绑定结果中,cPlanId == null。但是 JSON 明明是正确的,而且 DTO 上也有 @Data 自动生成 getter/setter。

尝试如下方式:

public void setCPlanId(String cPlanId) {this.cPlanId = cPlanId;
}

依然无效

尝试这样写:

public void setcPlanId(String cPlanId) {this.cPlanId = cPlanId;
}

反而成功了!


🔍 排查过程

✅ Step 1:确认 JSON 数据没问题

接口调试工具(如 Postman、Apifox)发送参数正常,字段名也符合预期:"cPlanId"

✅ Step 2:确认使用的 JSON 库

项目中同时存在:

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId>
</dependency>

但是在未手动配置 FastJsonHttpMessageConverter 的前提下,Spring Boot 默认用的是 Jackson

✅ Step 3:查看 ObjectMapper 配置

ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));

→ 没有特殊命名策略。


🎯 真正的问题原因:setter 方法名大小写

根据 JavaBean 规范:

  • private String cPlanId; 应该对应 setCPlanId(String),不是 setcPlanId(String)

  • Jackson 遵循此规范

  • Fastjson 则更“灵活”,会根据字段名匹配 setcPlanId(),哪怕违反 JavaBean 规范

但我们项目中,有可能某个地方通过工具类(如 JsonUtils)手动调用了 Fastjson 来解析参数,绕过了 Spring MVC 默认的 Jackson。


✅ 解决方案

✅ 推荐方式 1:统一命名,手动写标准方法

public class CPlanIdRequestDTO implements Serializable {private String cPlanId;public void setcPlanId(String cPlanId) {this.cPlanId = cPlanId;}
}

✅ 推荐方式 2:加注解双兼容

@JsonProperty("cPlanId")
@JSONField(name = "cPlanId")
private String cPlanId;

🧠 思考与总结

案例结果
@Data 自动生成 + Jackson✔️ 成功
setCPlanId()(规范写法) + Fastjson❌ 有时失败
setcPlanId()(非规范) + Fastjson✔️ 成功
未加 setter + Fastjson❌ 很可能失败
DTO 中添加注解✔️ 通用成功

本次问题提醒我们:

  • ✅ 保持 setter 方法命名符合 JavaBean 规范

  • ✅ 项目中尽量统一使用一种 JSON 库(建议 Jackson)

  • ✅ 若存在多种工具(如 Fastjson 工具类、Jackson 配置),注意行为差异

  • ✅ 接口 DTO 中的重要字段,手动加 getter/setter 更保险


一个字段无法反序列化的 bug,背后牵涉 JSON 工具的默认策略、setter 方法的命名大小写、工具类使用方式、项目配置混杂等多个维度。

 

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

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

相关文章

文本生成视频的主要开源模型

AI文本到视频生成技术发展迅速&#xff0c;这些模型的“快速”通常指相对于传统视频制作的效率&#xff08;生成时间从几秒到几分钟&#xff0c;取决于硬件&#xff09;&#xff0c;但实际速度取决于您的计算资源&#xff08;如GPU&#xff09;。这些模型大多依赖于深度学习框架…

vscode里面怎么配置ssh步骤

01.ubuntu里面下载几个插件还需要下载插件net-tools02.vscode里面下载插件会生成下面类似电视机的插件(room6)

【人工智能99问】激活函数有哪些,如何选择使用哪个激活函数?(5/99)

文章目录激活函数一、激活函数的分类1. 按“是否线性”分类2. 按“是否饱和”分类&#xff08;针对非线性激活函数&#xff09;3. 按“适用层”分类二、常见激活函数及特点&#xff08;一&#xff09;非线性激活函数&#xff08;主要用于隐藏层&#xff09;1. 饱和激活函数&…

代数——第4章——线性算子(算符)(Michael Artin)

第 4 章 线性算子(Linear Operators) That confusions of thought and errors of reasoning still darken the beginnings of Algebra, is the earnest and just complaint of sober and thoughtful men. (思维混乱和推理错误 仍然使代数的开端变得模糊不清&#xff0c; …

Neo4j Python 驱动库完整教程(带输入输出示例)

Neo4j Python 驱动库完整教程&#xff08;带输入输出示例&#xff09; 1. 基础连接示例 输入代码 from neo4j import GraphDatabase# 连接配置 URI "bolt://localhost:7687" USER "neo4j" PASSWORD "password123" # 替换为你的实际密码def t…

Axios 和 Promise 区别对比

Axios 和 Promise 是前端开发中两个不同的概念&#xff0c;尽管 Axios 基于 Promise 实现&#xff0c;但它们的核心定位和功能有显著区别。以下是对比分析&#xff1a; 1. 核心定位与功能Promise 定义&#xff1a;Promise 是 JavaScript 的异步编程方案&#xff0c;用于处理异步…

Git分支管理与工作流详解

前言 分支管理是Git最强大的功能之一&#xff0c;它允许开发者在不影响主代码库的情况下创建独立的工作空间。本文将详细介绍Git分支的操作和常见工作流策略&#xff0c;帮助团队更高效地协作开发。 1. Git分支的基本概念 1.1 什么是分支 在Git中&#xff0c;分支本质上是指…

【flutter】flutter网易云信令 + im + 声网rtm从0实现通话视频文字聊天的踩坑

接了一个国外的项目,项目采用网易云im 网易云信令声网rtm遇到的一些问题这个项目只对接口,给的工期是两周,延了工期,问题还是比较多的 需要全局监听rtm信息,收到监听内容,引起视频通话网易云给的文档太烂,所有的类型推策只能文档一点点推声网的rtm配置网易云的信令,坑太多,比如…

hive/spark sql中unix_timestamp 函数的坑以及时间戳相关的转换

我用的是hive版本是3.1.3&#xff0c;spark版本是3.3.1&#xff0c;它们的unix_timestamp 函数在同样的语句下转换出来的时间戳是完全不同的&#xff0c;如下试验所示1.unix_timestamp 函数的坑上图试验中我同样的计算 2025-07-11 10:00:00 时间点对应的时间戳&#xff0c;但是…

MyBatis专栏介绍

专栏导读 在当今的软件开发领域&#xff0c;持久层框架的选择对于提高开发效率和数据处理能力至关重要。MyBatis作为一个半自动化的ORM框架&#xff0c;因其灵活、高效的特点&#xff0c;在众多开发者中广受好评。本专栏《MyBatis实战》旨在通过深入浅出的方式&#xff0c;帮助…

HarmonyOS从入门到精通:自定义组件开发指南(七):自定义事件与回调

HarmonyOS从入门到精通&#xff1a;自定义组件开发指南&#xff08;七&#xff09;&#xff1a;自定义事件与回调 在HarmonyOS应用开发中&#xff0c;组件化架构是构建复杂界面的基础&#xff0c;而组件间的高效通信则是实现业务逻辑的核心。自定义事件与回调机制作为组件交互的…

C++编程学习(第七天)

基于过程的程序设计C既可以用来进行基于过程的程序设计&#xff0c;又可以用来进行面向对象的程序设计。基于过程的程序设计又称为过程化的程序设计&#xff0c;它的特点是&#xff1a;程序必须告诉计算机应当具体怎么做&#xff0c;也就是要给出计算机全部操作的具体过程&…

ubuntu透网方案

场景&#xff1a;两个linux/Ubuntu系统&#xff0c;一个可以上网&#xff0c;一个不能&#xff0c;让不能上网的,让能上网的共享网络 步骤 1&#xff1a;修改 /etc/sysctl.conf sudo nano /etc/sysctl.conf 找到或添加以下行&#xff1a; net.ipv4.ip_forward1 按 CtrlO 保存&a…

基于Python的物联网岗位爬取与可视化系统的设计与实现【海量数据、全网岗位可换】

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍数据采集数据预处理系统展示总结每文一语有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 随着物联网技术的迅速发展&#xff0c;物联网行业…

线性回归原理推导与应用(十):逻辑回归多分类实战

本篇文章将利用sklearn中内置的鸢尾花数据进行逻辑回归建模并对鸢尾花进行分类。对于逻辑回归和线性回归的相关原理&#xff0c;可以查看之前的文章 数据导入 鸢尾花数据是机器学习里的常用数据&#xff0c;首先导入一些基础库并从sklearn中导入数据集 #导入用到的一些pytho…

Docker 部署emberstack/sftp 镜像

Docker 部署 emberstack/sftp 镜像 1、找到国内可用的docker源,本次测试使用docker.1ms.run 2、下载emberstack/sftp镜像docker pull docker.1ms.run/emberstack/sftp3、安装并启动emberstack/sftp镜像docker run -d -p 22:22 --name SFTP -v D:\SFTP:/home/sftpuser/sftp --pr…

【华为OD】MVP争夺战2(C++、Java、Python)

文章目录题目题目描述输入描述输出描述示例思路核心思路&#xff1a;关键观察&#xff1a;算法步骤&#xff1a;排序策略&#xff1a;特殊情况处理&#xff1a;代码CJavaPython复杂度分析时间复杂度空间复杂度结果总结题目 题目描述 给定一个整型数组&#xff0c;请从该数组中…

Python打卡训练营Day58

DAY 58 经典时序预测模型2知识点回顾&#xff1a;时序建模的流程时序任务经典单变量数据集ARIMA&#xff08;p&#xff0c;d&#xff0c;q&#xff09;模型实战SARIMA摘要图的理解处理不平稳的2种差分n阶差分---处理趋势季节性差分---处理季节性建立一个ARIMA模型&#xff0c;通…

003大模型基础知识

大模型分类&#xff1a; 技术架构&#xff1a; Encoder Only Bert Decoder Only 著名的大模型都是 Encoder - Decoder T5 是否开源&#xff1a; 开源阵营&#xff1a; Llama DeepSeek Qwen 闭源阵营&#xff1a; ChatGpt Gemini Claude 语言模型发展阶段&am…

JVM监控及诊断工具-GUI篇

19.1. 工具概述 使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息&#xff0c;但它们存在下列局限&#xff1a; 1&#xff0e;无法获取方法级别的分析数据&#xff0c;如方法间的调用关系、各方法的调用次数和调用时间等&#xff08;这对定位应用性能瓶颈…