問題復現
今天碰到一個小問題,調用方反饋我們支付回調接口返回的數據字段和文檔定義不一致.文檔定義的字段名稱是 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 解析也有此類問題.