採坑: Lombok 的 boolean 序列化問題

問題復現

  今天碰到一個小問題,調用方反饋我們支付回調接口返回的數據字段和文檔定義不一致.文檔定義的字段名稱是 isClose,而實際返回字段是 close.
  我趕緊查看源碼,代碼非常簡單,只有Lombok 註解,那問題的源頭肯定是使用Lombok註解導致的了!

  • 源碼
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PayCallBackResponse implements Serializable {

    private static final long serialVersionUID = 4454976958022297251L;

    boolean isClose;
}
  • lombok 生成的set方法
         PayCallBackResponse response = new PayCallBackResponse();
         response.setClose(Boolean.FALSE);

  這樣一看就很明瞭,都是 Lombok 惹得禍

修復方案

  修復方式非常簡單,將屬性類型修改爲 Boolean 包裝類型即可

  • 源碼
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PayCallBackResponse implements Serializable {

    private static final long serialVersionUID = 4454976958022297251L;
 
    Boolean isClose;
}
  • 修復後,lombok 生成的set方法
        PayCallBackResponse response = new PayCallBackResponse();
        response.setIsClose(Boolean.FALSE);
問題原因

  時間關係並沒有查看 Lombok 源碼,但是根據經驗猜測,是因爲 Lombok 遵守 JavaBean 規範(布爾類型 的字段命名是 isXxx 時,get/set 方法可以省略 is前綴)引起的.Mybatis 源碼中的 JavaBean 解析也有此類問題.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章