在使用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
解決方案
@JsonProperty("nDecisonVar")
Integer nDecisonVar;
不行
不對