Spring Boot:DTO 字段 cPlanId 無法反序列化的奇葩問題

本文記錄一次在 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;這對定位應用性能瓶頸…